这个例子有点做作,但它来自一个测试,所以它只是这样工作,并将帮助我弄清楚如何在实际的库中使用它。我有一个lambda,定义如下:
l = lambda { |v| process(v) }
我想将它传递给一个对象,并让proc在该对象的上下文中运行。对象可能如下所示:
class LambdaRunner
def process(v)
puts v
end
def run(proc)
# code to run proc in the context of the object
end
end
我熟悉使用instance_eval运行proc的解决方案。
instance_eval(&proc)
但这不起作用,因为我需要将值传递给proc。我已经管理了类似工作解决方案的东西,但它感觉很容易出错并且容易出错。
self.class.class_eval do
define_method(:runner, &proc)
end
runner('hi from lambda runner')
undefined method process
答案 0 :(得分:1)
请参阅instance_exec的文档(这是向后移植到1.8.7)。假设你的proc只需要一个参数|v|
,你可能会在LambdaRunner
中得到类似的结果。
def run(proc) instance_exec(v_value, &proc) end
顺便说一下,在没有#instance_exec
的Ruby版本中,你的hack基本上是实现它的唯一方法。这就是我implemented it对于那些没有后向移植方法的旧Rubies的方法。