【发布时间】:2011-06-28 11:10:36
【问题描述】:
例如在我写的这行代码中,print 和 puts 产生不同的结果。
1.upto(1000).each { |i| print i if i % 2 == 0 }
【问题讨论】:
标签: ruby
例如在我写的这行代码中,print 和 puts 产生不同的结果。
1.upto(1000).each { |i| print i if i % 2 == 0 }
【问题讨论】:
标签: ruby
puts 如果还没有参数,则在每个参数的末尾添加一个新行。
print 不添加新行。
例如:
puts [[1,2,3], [4,5,nil]] 会返回:
而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 项目(只是一个空行)并且每个项目都在不同的行上。
【讨论】:
nil
print 输出每个参数,然后是$,,到$stdout,然后是$\。相当于args.join($,) + $\
puts 将$, 和$\ 都设置为“\n”,然后执行与print 相同的操作。主要区别在于 每个参数 是带有 puts 的新行。
您可以通过require 'english' 使用user-friendly names 访问这些全局变量。
【讨论】:
english lib 的好技巧
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 > 打印 [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 没有,就像没有插入到字符串中的数组的情况一样。 (必然如此,因为在评估字符串文字时会发生插值。)