例如,在我写的这行代码中,print和puts产生不同的结果。
print
puts
1.upto(1000).each { |i| print i if i % 2 == 0 }
puts在每个参数的末尾添加一个新行,如果已经没有一个。
print不添加新行。
例如:
puts [[1,2,3], [4,5,nil]]返回:
puts [[1,2,3], [4,5,nil]]
1 2 3 4 5
print [[1,2,3], [4,5,nil]]
[[1,2,3], [4,5,nil]]
Notice how puts does not output the nil value whereas print does.
print输出每个参数,后跟$,,到$stdout,后跟$\。它等价于args.join($,) + $\
$,
$stdout
$\
args.join($,) + $\
puts将$,和$\设置为“\n”,然后做与print相同的事情。关键的区别是每一个参数是puts的新行。
你可以用require 'english'来访问这些全局变量。
require 'english'
print [nil, 1, 2]
给了
[nil, 1, 2]
但
puts [nil, 1, 2]
1 2
注意,没有出现nil项(只是一个空行),每个项在不同的行上。
如果你想使用puts在字符串中输出数组,你将得到与使用print相同的结果:
puts "#{[0, 1, nil]}": [0, 1, nil]
但如果不是在一个带引号的字符串中,那么是。唯一的区别是使用puts时的new line。
API文档给出了一些好的提示:
print() → nil print(obj, ...) → nil 将给定对象写入ios。返回nil。 流必须打开才能写入。每个给定的不是a的对象 字符串将通过调用它的to_s方法进行转换。当 调用,不带参数,打印$_的内容 如果输出字段分隔符($,)不是nil,它将 插入到对象之间。如果输出记录分隔符 ($\)不是nil,它被追加到输出 ... puts(obj, ...) → nil 将给定对象写入ios。在任意换行符之后写入换行符 不要已经以换行符序列结束。返回nil。< / p > 流必须打开才能写入。如果使用数组参数调用, 将每个元素写入新行。每个给定的不是a的对象 字符串或数组将通过调用其to_s方法进行转换。 如果不带参数调用,则输出一个换行符
print() → nil
print(obj, ...) → nil
将给定对象写入ios。返回nil。
nil
流必须打开才能写入。每个给定的不是a的对象 字符串将通过调用它的to_s方法进行转换。当 调用,不带参数,打印$_的内容
to_s
$_
如果输出字段分隔符($,)不是nil,它将 插入到对象之间。如果输出记录分隔符 ($\)不是nil,它被追加到输出
...
puts(obj, ...) → nil
将给定对象写入ios。在任意换行符之后写入换行符 不要已经以换行符序列结束。返回nil。< / p >
流必须打开才能写入。如果使用数组参数调用, 将每个元素写入新行。每个给定的不是a的对象 字符串或数组将通过调用其to_s方法进行转换。 如果不带参数调用,则输出一个换行符
对上面给出的点做了一点实验,区别似乎是:
2.1.3 :001 > print 'hello', 'world' helloworld => nil 2.1.3 :002 > puts 'hello', 'world' hello world => nil 2.1.3 :003 > $, = 'fanodd' => "fanodd" 2.1.3 :004 > print 'hello', 'world' hellofanoddworld => nil 2.1.3 :005 > puts 'hello', 'world' hello world => nil
puts automatically unpacks arrays, while print does not:
2.1.3 :001 > print [1, [2, 3]], [4] [1, [2, 3]][4] => nil 2.1.3 :002 > puts [1, [2, 3]], [4] 1 2 3 4 => nil
print with no arguments prints $_ (the last thing read by gets), while puts prints a newline:
gets
2.1.3 :001 > gets hello world => "hello world\n" 2.1.3 :002 > puts => nil 2.1.3 :003 > print hello world => nil
print writes the output record separator $\ after whatever it prints, while puts ignores this variable:
mark@lunchbox:~$ irb 2.1.3 :001 > $\ = 'MOOOOOOO!' => "MOOOOOOO!" 2.1.3 :002 > puts "Oink! Baa! Cluck! " Oink! Baa! Cluck! => nil 2.1.3 :003 > print "Oink! Baa! Cluck! " Oink! Baa! Cluck! MOOOOOOO! => nil
puts调用每个参数的to_s,并在每个字符串中添加一个新行,如果它没有以new line结束。 print只是通过调用它们的to_s来输出每个参数 例如< p >: puts "one two": one two < / p >
puts "one two"
one two
{新行}
puts "one two\n"
{new line} #put不会向结果中添加新行,因为字符串以新行结束
print "one two"
print "one two\n"
还有另一种输出方式:p
p
对于每个对象,直接写入obj。Inspect后面跟着一个换行符指向程序的标准输出。
有助于输出调试信息。 p "aa\n\t": aa\n\t < / p >
p "aa\n\t"
aa\n\t