看看这段代码:
def hello
p "Hey!"
end
p hello
输出将是:
"Hey!"
"Hey!"
=> "Hey!"
所以这是我的结论: puts 自身返回将在 Ruby 代码输出中发送的文本,否则它不会打印“嘿!” 再次。打印字符串时发生了什么?如果 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
也将返回它,这意味着辅助p
调用将重复它。
这可能是默认puts
返回的原因。nil