【问题标题】:Ruby - What is this outputRuby - 这是什么输出
【发布时间】:2011-08-12 17:22:49
【问题描述】:

我知道这段代码可能不太正确:

def print_string(&str)
puts str
end

print_string{"Abder-Rahman"}

但是,当我运行它时,这就是我得到的:

#<Proc:0x03e25d98@r.rb:5>

这个输出是什么?

【问题讨论】:

    标签: ruby proc-object


    【解决方案1】:

    这是 Proc 对象的默认字符串表示。因为“Abder-Rahman”在大括号中,Ruby 认为您正在定义一个块。你的意思是把str.call 放在你的函数定义中吗?这应该调用您的块并返回您在其中定义的字符串表达式。

    【讨论】:

    • 这会抛出异常,因为该方法被定义为期望一个块,没有普通参数。
    【解决方案2】:

    问题是您已经声明“print_string”方法接受一个块参数(令人困惑的名称为“str”),而您只需打印 proc 本身。您可能想调用给定的过程来查看它返回的字符串值:

    def call_proc(&proc)
      proc.call
    end
    call_proc { 'Foobar' }
    # => "Foobar"
    

    您发现了语法糖,如果您使用与符号&amp; 装饰方法定义的最后一个参数,那么它将绑定到方法调用的块参数。完成相同任务的另一种方法如下:

    def call_proc2
      yield if block_given?
    end
    call_proc2 { 'Example' }
    # => 'Example'
    

    另请注意,可以使用Proc objects(或 Proc 构造函数的“lambda”别名)直接将过程作为对象处理:

    p1 = Proc.new { 'Foo' }
    p1.call # => "Foo"
    p2 = lambda { 'Bar' }
    p2.call # => "Bar"
    

    【讨论】:

      【解决方案3】:

      您将块传递给方法,如前缀 & 以及您如何调用它所表示的。然后该块在内部转换为 Proc。

      puts str.call 在您的方法中将打印字符串,尽管您为什么要以这种方式定义方法是另一回事。

      查看过程: http://www.ruby-doc.org/core/classes/Proc.html

      【讨论】:

        【解决方案4】:

        当函数/方法的最后一个参数前面有 &amp; 字符时,ruby 需要一个 proc 对象。这就是为什么puts 的输出是这样的原因。

        This blog has an article about the unary & operator.

        【讨论】:

          猜你喜欢
          • 2013-04-08
          • 2020-10-23
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 2020-11-09
          • 2011-12-19
          相关资源
          最近更新 更多