例如,在我写的这行代码中,print
和puts
会产生不同的结果。
1.upto(1000).each { |i| print i if i % 2 == 0 }
答案 0 :(得分:360)
puts
会在每个参数的末尾添加一个新行。
print
不会添加新行。
例如:
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]]
注意puts如何输出nil值而print不会。
答案 1 :(得分:61)
一个很大的区别是,如果您正在显示数组。 特别是那些有NIL的人。 例如:
print [nil, 1, 2]
给出
[nil, 1, 2]
但
puts [nil, 1, 2]
给出
1
2
注意,没有出现nil项(只是一个空白行)和不同行上的每个项目。
答案 2 :(得分:40)
print
将每个参数(后跟$,
)输出到$stdout
,然后输出$\
。它相当于args.join($,) + $\
puts
将$,
和$\
设置为“\ n”,然后执行与print
相同的操作。关键区别在于每个参数是一个带puts
的新行。
您可以require 'english'
使用user-friendly names访问这些全局变量。
答案 3 :(得分:18)
The API docs给出了一些好的提示:
print() → nil
print(obj, ...) → nil
将给定对象写入 ios 。返回
nil
。必须打开流才能写入。每个给定的对象不是 字符串将通过调用其
的内容to_s
方法进行转换。什么时候 不带参数调用,打印$_
。如果输出字段分隔符(
$,
)不是nil
,则为 插入对象之间。如果输出记录分隔符 ($\
)不是nil
,它会附加到输出中。...
puts(obj, ...) → nil
将给定对象写入 ios 。在任何后面写一个换行符 还没有以换行符结束。返回
nil
。必须打开流才能写入。如果使用数组参数调用, 将每个元素写在新行上。每个给定的对象不是 字符串或数组将通过调用其
to_s
方法进行转换。 如果不带参数调用,则输出一个换行符。
稍微尝试上面给出的几点,差异似乎是:
使用多个参数调用时,print
将它们分隔为“输出字段分隔符”$,
(默认为空),而puts
则按换行符分隔它们。 puts
也会在最终参数后面添加换行符,而print
则不会。
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
自动解包数组,而print
则不会:
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
打印$_
(gets
读取的最后一件事),而puts
打印换行符:
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
在输出的任何内容后写入输出记录分隔符$\
,而puts
忽略此变量:
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
答案 4 :(得分:3)
puts
调用每个参数的to_s
,并为每个字符串添加一个新行,如果它不以新行结尾。
print
只需通过调用to_s
来输出每个参数。
例如:
puts "one two"
:
one two
{new line}
puts "one two\n"
:
one two
{new line} #puts不会在结果中添加新行,因为字符串以新行结尾
print "one two"
:
one two
print "one two\n"
:
one two
{new line}
还有另一种输出方式:p
对于每个对象,直接将obj.inspect后跟换行符写入程序的标准输出。
输出调试信息很有帮助。
p "aa\n\t"
:aa\n\t
答案 5 :(得分:-1)
但是...
如果您想使用" puts"在字符串中输出数组,您将获得与使用" print":
时相同的结果puts "#{[0, 1, nil]}":
[0, 1, nil]
但如果没有带引号的字符串则是。唯一的区别是当我们使用" puts"