【问题标题】:ruby lambda context红宝石 lambda 上下文
【发布时间】:2010-06-28 15:57:59
【问题描述】:

假设我在最顶层有以下 ruby​​ 定义

callable = lambda {"#{hi}"}

并假设稍后我创建了一个名为temp 的对象,该对象有一个名为hi 的方法。现在我想做的是在temp 的上下文中调用callable。我试过做

temp.instance_eval do callable.call end

但这给了我错误“NameError: undefined local variable or method 'hi' for main:Object”。我想知道是否有任何方法可以将callable 的上下文重新绑定到temp,这样我就不会收到错误消息?我知道我可以在 main:Object 上定义 method_missing 并将所有方法调用重新路由到 temp 但这似乎太大了,无法完成我想要的。

【问题讨论】:

    标签: ruby lambda metaprogramming


    【解决方案1】:

    您要查找的代码是

    temp.instance_eval(&callable)
    

    【讨论】:

    • 能否请您详细说明temp.instance_eval(&callable)temp.instance_eval do callable.call end 之间的区别。在我看来,任何一个都应该可以工作,但由于某种原因后者不能。
    • @davidk01: b/c Proc 通常使用定义它的上下文。 instance_eval 强制给定的 proc 使用调用对象的上下文,但不会递归地这样做(因此在该 proc 中调用的 proc 不会进行上下文转换)。
    • @rampion:你说的没有意义,因为&callable 也是一个过程,它确实会发生上下文转移,当我们使用instance_eval(&callable) 时它实际上可以正常工作
    • @davidk01:对。在这种情况下,&callable 是给定的 proc,所以它 上下文转移的。 meth(&(lambda { whatever }))meth { whatever } 是等价的。 meth { lambda { whatever }.call } 不一定等同于其他两个。
    • @rampion:哈,我刚明白了。感谢您的解释,我花了一段时间才弄清楚您的意思>但不是递归地这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多