在IRB中使用Ruby的输出机制与“p”,“print”和“puts”混淆

时间:2013-02-16 08:24:55

标签: ruby

>> p "hi"; puts p "hello"
"hi"
"hello"
hello
=> nil

从输出结果可以清楚地看出,"hi""hello"已由两个p打印出来。 然后在下面打印puts;

hello
=> nil

但问题是:当p返回时

"hello" 
=> "hello" 

putsp收到左侧或右侧的内容?现在更深入地看一下我尝试了以下内容:

>> p "hi"; puts print "hello"
"hi"
hello
=> nil

看看上面的内容,我理解的是p打印了它。与下面的输出部分混淆。

hello
=>nil 

hello打印print然后=> nil的左侧是哪里?如果我认为puts已使用print返回值nil触发,则输出应为

hello

=>nil # the extra blank line is for `nil.to_s` .

但从实际输出中我无法得出结论。如果我认为puts已使用print的打印值hello触发,则输出应为

hello
=>nil # then where the output of print statement went out?

但从实际输出中我无法得出结论。

我使用的是Ubuntu 12.10和Ruby 1.9.3。谁能帮助我了解发生了什么?

1 个答案:

答案 0 :(得分:0)

您的示例与

相同
p("hi")
puts(print("hello"))

您在输出中没有以空行结尾的原因是print不会在其输出中附加换行符。

printhello写入stdout,返回nil,然后将写入(在同一行)nil.to_s(即空字符串)后跟换行字符,这样就得到了完全相同的输出,就像你写了puts("hello")

一样