为什么“puts”会返回一个空行,而不是“puts []”?

时间:2012-12-11 06:34:23

标签: ruby arrays io puts

我正在浏览Ruby tutorial,并了解了代码

puts 'start'
puts
puts 'end'

将输出三行,但以下代码

puts 'start'
puts []
puts 'end'

只会输出两个。陈述的原因是[] 不是一个对象(编辑:“不指向任何东西”),所以puts无法对它做任何事情,但为什么呢在第一种情况下也不是这样吗?

我试图找到一个关于puts的官方网页来解决这个问题,this one没有帮助。

5 个答案:

答案 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]