Answers:
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如何。
一个很大的不同是,如果要显示数组。尤其是那些有NIL的人。例如:
print [nil, 1, 2]
给
[nil, 1, 2]
但
puts [nil, 1, 2]
给
1
2
请注意,没有出现零项目(只是空白行),并且每个项目都在不同的行中。
nil
print输出每个参数,后跟$,,到$stdout,再跟$\。相当于args.join($,) + $\
puts将$,和都设置$\为“ \ n”,然后执行与相同的操作print。关键区别在于每个参数都是的换行符puts。
您可以require 'english'使用用户友好的名称访问这些全局变量。
englishlib 上的一个不错的提示
API文档提供了一些很好的提示:
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
=> nilputs自动解压缩数组,而print不会:
2.1.3:001> 打印[1,[2、3]],[4] [1,[2,3]] [4] =>无 2.1.3:002> 看跌期权[1,[2,3]],[4] 1个 2 3 4 =>无
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
=> nilprint$\在打印任何内容之后写输出记录分隔符,而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! => nilputs调用to_s每个参数的,如果不以新行结尾,则向每个字符串添加新行。
print只需通过调用每个参数即可输出它们to_s。
例如
puts "one two":
one two
{新队}
puts "one two\n":
one two
{new line} #puts不会在结果中添加新行,因为字符串以新行结尾
print "one two":
one two
print "one two\n":
one two
{新队}
还有另一种输出方式: p
对于每个对象,直接在程序的标准输出中写入obj.inspect,后跟换行符。
输出调试信息很有帮助。
p "aa\n\t":aa\n\t
如果要在字符串中使用来输出数组puts,则将获得与使用时相同的结果print:
puts "#{[0, 1, nil]}":
[0, 1, nil]
但是,如果不带引号的字符串,则可以。唯一的区别是使用时换行了puts。
printf代替puts会得到相同的结果,但实际上并没有。该puts变种在最后添加一个换行符,而printf一个没有,就好像那里没有阵列插入到字符串的情况。(有必要这样,因为插值发生在评估字符串文字时。)