【问题标题】:Why does "puts" return a blank line, but not "puts []"?为什么“puts”返回一个空行,而不是“puts []”?
【发布时间】:2012-11-28 16:31:46
【问题描述】:

我正在通过Ruby tutorial,得知代码

puts 'start'
puts
puts 'end'

会输出三行,但是下面的代码

puts 'start'
puts []
puts 'end'

只会输出两个。声明的原因是 [] 不是一个对象 (编辑:“不指向任何东西”),所以puts 不能用它做任何事情,但为什么不是第一种情况是真的吗?

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

【问题讨论】:

  • 那是错误的。 [] 是一个对象。
  • [] 在您将其用作some_method[] 时不是对象(方法和[] 之间没有空格)。但是在您的情况下,它显然是一个对象
  • @sawa,我的意思是 [][]= 方法
  • @slivu []puts [] 不能是方法。我的理解是[] 需要一个明确的接收者。
  • @sawa,当然,似乎 OP 对 [] 何时用作对象以及何时用作方法感到困惑。

标签: ruby arrays io puts


【解决方案1】:

声明的原因是 [] 不是对象

在哪里说的?

puts 对数组有特殊处理。当您将数组传递给它时,它会在新行上打印每个元素。你传给它一个零元素的数组,它会打印零行。

【讨论】:

  • 教程中:“数组没有指向任何东西,所以puts没有任何东西。”有道理,谢谢!
  • @Zach 您在教程中引用的部分具有误导性。该数组确实指向某些东西;它只是没有任何元素。
  • 这更有意义。
【解决方案2】:

puts 使用数组将每个元素打印一行。没有元素,没有线条。

编辑:我刚才所说的记录在您的链接中:

如果使用数组参数调用,则将每个元素写入新行。

【讨论】:

  • 是的,我应该自己抓住它。谢谢!
【解决方案3】:

您分享的链接指出:

如果使用数组参数调用,则将每个元素写入新行。

puts []

意思是,你用空数组调用puts。即没有要打印的元素。事情就是这样发生的。

【讨论】:

    【解决方案4】:
    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
    

    【讨论】:

      【解决方案5】:

      不带参数的放置具有特殊行为 - 即打印新行。在所有其他情况下,它将所有参数视为一个数组,并使用 #to_s 将这些参数映射到字符串,并在新行上输出每个字符串。这就是调用puts [] 时没有输出的原因。如果你想在输出中有一个新行,你可以调用 puts 不带参数(这是 obvjous),或者使用空数组的 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] 
      

      【讨论】:

        猜你喜欢
        • 2019-02-08
        • 2015-11-28
        • 1970-01-01
        • 2019-09-14
        • 2012-02-16
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多