-1

このコードを見てください:

def hello
   p "Hey!"
end
p hello

出力は次のようになります。

"Hey!"
"Hey!"
=> "Hey!"

そして、これが私の結論です。puts自体は、Rubyコードで出力されるテキストを返します。そうでない場合、「Hey!」は出力されません。また。文字列の印刷中に何が起こっていますか?putsがそれを標準出力に直接送信しない場合、誰がどのように責任を負いますか?

4

2 に答える 2

5

すべてのメソッドが値を返す

Ruby では、値がnilであっても、ほとんどすべてが値を返します。ただし、あなたの場合、問題はKernel#pKernel#putsが返す値が異なることです。

def hello
   # Print string literal, then return
   # the printed object.
   p "Hey!"
end

# Print the return value of main#hello.
p hello

その結果、文字列はメソッド内で一度出力され、次にメソッドの戻り値が Kernel#p に渡されて再度出力されます。これは仕様によるものです。

Kernel#puts を使用して重複出力を回避する

def hello
   # Print string; return nil.
   puts "Hey!"
end

# Calls main#hello, but prints nil (blank line).
puts hello

これにより、メソッド内に文字列リテラルが出力され、メソッドからの戻り値が nil であるため空白行が出力されます。

Hey!

=> nil

正しい道

空白行を避けたい場合は、標準出力に複数回送信することを避けてください。例えば:

def hello
  'Hey!'
end

p hello
于 2012-12-31T21:06:23.873 に答える
2

pメソッドが指定された文字列を返す場合、それも返しますhello。これは、2次p呼び出しがそれを繰り返すことを意味します。

これがおそらくデフォルトでputs戻る理由です。nil

于 2012-12-31T20:47:53.737 に答える