2010-06-28 49 views
3

可以说我有在最高级别红宝石拉姆达方面

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,但是这看起来像是太大的方法来实现我想要的。

回答

6

你正在寻找的代码是

temp.instance_eval(&callable) 
+0

能否请您阐述一下temp.instance_eval(赎回)之间'的区别'和'temp.instance_eval做callable.call end'。在我看来,任何一个人都应该工作,但后者不是出于某种原因。 – davidk01 2010-06-28 16:07:13

+0

@ davidk01:b/c一个Proc通常使用它定义的上下文。 instance_eval强制给定的过程使用调用对象的上下文,但不会递归地这样做(所以在该过程中调用的过程不会上下文移位)。 – rampion 2010-06-28 17:21:00

+0

@rampion:你所说的没有意义,因为'&callable'也是一个proc,它确实得到了上下文转换,并且当我们使用'instance_eval(&callable)'时,它实际上可以正常工作' – davidk01 2010-06-28 18:33:50