我正在浏览Ruby tutorial,并了解了代码
puts 'start'
puts
puts 'end'
将输出三行,但以下代码
puts 'start'
puts []
puts 'end'
只会输出两个。陈述的原因是[] 不是一个对象(编辑:“不指向任何东西”),所以puts
无法对它做任何事情,但为什么呢在第一种情况下也不是这样吗?
我试图找到一个关于puts
的官方网页来解决这个问题,this one没有帮助。
答案 0 :(得分:8)
陈述的原因是[]不是对象
说明在哪里?
puts
对数组有特殊处理。当您传递一个数组时,它会在新行上打印每个元素。你传递一个零元素的数组,它会打印零行。
答案 1 :(得分:2)
puts
将为每个元素打印一行。没有元素,没有线条。
编辑:我刚才所说的内容记录在您的链接中:
如果使用数组参数调用,则将每个元素写入新行。
答案 2 :(得分:2)
puts arr
就像
arr.each { |e| puts e }
你可以自己做这样的事情:
def p(s)
if s.respond_to? 'each'
s.each { |e| p e }
else
puts s
end
end
p 'hello' # prints line with 'hello'
p [] # prints nothing
p [1, 2] # prints 2 lines with 1 and 2
答案 3 :(得分:2)
您的共享链接,声明:
如果使用数组参数调用,则将每个元素写入新行。
puts []
表示您使用空数组调用puts
。即没有要打印的元素。这就是发生的事。
答案 4 :(得分:2)
没有参数的Puts有特殊的行为 - 即打印新行。在所有其他情况下,它将所有参数视为数组,并使用#to_s将这些参数映射到字符串,并在新行上输出每个字符串。这就是调用puts []
时没有输出的原因。如果你想在输出中有一个新行,你可以调用puts
没有参数(它是显而易见的),或者使用带有空数组的splat运算符,如:puts *[]
。
您可以编写自己的puts
实现,以便更好地理解。
def my_puts(*args)
STDOUT.write("args is #{args.inspect}\n")
if args.empty?
STDOUT.write("\n")
else
args.each { |arg| STDOUT.write("#{arg.to_s}\n") }
end
end
1.9.3p194 :039 > my_puts
args is []
=> 1
1.9.3p194 :040 > my_puts []
args is [[]]
[]
=> [[]]
1.9.3p194 :041 > my_puts *[]
args is []
=> 1
1.9.3p194 :042 > my_puts 1,2,3
args is [1, 2, 3]
1
2
3
=> [1, 2, 3]
1.9.3p194 :043 > my_puts [1,2,3]
args is [[1, 2, 3]]
[1, 2, 3]
=> [[1, 2, 3]]
1.9.3p194 :044 > my_puts *[1,2,3]
args is [1, 2, 3]
1
2
3
=> [1, 2, 3]