このコードを見てください:
def hello
p "Hey!"
end
p hello
出力は次のようになります。
"Hey!"
"Hey!"
=> "Hey!"
そして、これが私の結論です。puts自体は、Rubyコードで出力されるテキストを返します。そうでない場合、「Hey!」は出力されません。また。文字列の印刷中に何が起こっていますか?putsがそれを標準出力に直接送信しない場合、誰がどのように責任を負いますか?
Ruby では、値がnilであっても、ほとんどすべてが値を返します。ただし、あなたの場合、問題はKernel#pとKernel#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 に渡されて再度出力されます。これは仕様によるものです。
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
p
メソッドが指定された文字列を返す場合、それも返しますhello
。これは、2次p
呼び出しがそれを繰り返すことを意味します。
これがおそらくデフォルトでputs
戻る理由です。nil