【问题标题】:Ruby block, procs and instance_evalRuby 块、procs 和 instance_eval
【发布时间】:2011-06-16 13:24:13
【问题描述】:

我最近尝试做类似的事情:

a = "some string"
b = Proc.new{ upcase }
a.instance_eval b

这给出了错误:

TypeError: 无法将 Proc 转换为 String

但这有效:

def b(&block)
  "some string".instance_eval &block
end

b{ upcase }

使用此方法进一步了解:

def b(&block)
  "some string".instance_eval block
end

产生相同的Proc to String 错误。

所以...我对块的理解是它们只是触发。但显然有这个 & & 符号有一些特别之处......

谁能给我解释一下?是否可以将普通的 proc 转换为这个 &block 对象的特殊之处?

编辑

刚刚解决了我的第二个问题,在 proc 前加上 &... 这很简单,但这到底是在做什么?

【问题讨论】:

    标签: ruby block lambda proc-object


    【解决方案1】:

    要使您的第一个示例正常工作,您所要做的就是:

    >> a.instance_eval &b #=> "SOME STRING"
    

    原因是instance_eval 需要一个字符串或一个块,而与号提供后者。

    【讨论】:

    • 有趣的是,当我在写这个问题并询问其他人时,我是如何开始解决这个问题的……最后意识到我只需要知道 proc 和 block 之间的区别。非常感谢!!
    • 提供了死链接
    【解决方案2】:

    不同之处在于a.instance_eval bb 作为常规参数传递给instance_eval,而a.instance_eval &b 将其作为块传递。这是两个不同的东西。

    考虑这个方法调用:

    obj.foo(bar) do |x| 
      stuff(x) 
    end
    

    使用一个常规参数 (bar) 和一个块参数 (do |x| stuff(x) end) 调用方法 foo。在方法定义中,通过在块参数前加上&前缀来区分它们:

    def foo(arg, &block)
    

    如果你想传递一个变量表达式而不是一个文字块,这同样可以通过在表达式前加上 & 来完成(这应该产生一个 Proc)。

    如果你传递一个没有& 的参数,它会进入 arg 槽而不是 block 槽。参数恰好是 Proc 的一个实例并不重要。语法规定了方法如何传递和处理它。

    【讨论】:

    • 简洁明了的答案,谢谢! (对不起,我已经接受了@Michaels,因为他指导我了解块和 Proc 之间的差异)
    【解决方案3】:

    这是因为 instance_eval 接受一个字符串来 eval 或一个块。 instance_eval(&block) 将您的 block 作为一个块传递给 instance_eval。

    【讨论】:

    • 但是blockproc 之间有什么区别?
    【解决方案4】:

    关键区别在于Proc 实例是对象,而块不是对象& 是一个将块和 Proc 实例相互交换的运算符。

    方法的所有参数都必须是对象。除了参数之外,方法还可以采用块。 instance_eval 是一个接受字符串参数或块的方法。传递 Proc 对象将满足这两种情况。如果您将& 附加到 Proc 对象,则该对象将作为块处理。

    【讨论】:

      【解决方案5】:

      这将起作用:

      a = "some string"
      b = Proc.new{ upcase }
      a.instance_eval &b
      

      instance_eval 方法可以接收块参数。 bProc

      【讨论】:

        猜你喜欢
        • 2014-12-23
        • 2015-08-04
        • 2017-04-22
        • 2015-06-27
        • 2011-05-23
        • 1970-01-01
        • 2013-08-05
        • 2012-01-12
        • 1970-01-01
        相关资源
        最近更新 更多