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'
使用用户友好的名称访问这些全局变量。
english
lib 上的一个不错的提示
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
=> nil
puts
自动解压缩数组,而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
=> 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
puts
调用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
一个没有,就好像那里没有阵列插入到字符串的情况。(有必要这样,因为插值发生在评估字符串文字时。)