-1

这个例子有点做作,但它来自一个测试,所以它只是以这种方式工作,并将帮助我弄清楚如何在实际的库中使用它。我有一个 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。我已经管理了类似工作解决方案的东西,但感觉很hacky并且容易出错。

self.class.class_eval do
  define_method(:runner, &proc)
end
runner('hi from lambda runner')

所有其他方法都已满足undefined method process

4

1 回答 1

1

请参阅instance_exec的文档(向后移植到 1.8.7)。假设您的 proc 接受一个参数|v|,您可能会在LambdaRunner.

  定义运行(过程)
    instance_exec(v_value, &proc)
  结尾

顺便说一句,在没有 Ruby 的版本中#instance_exec,你的 hack 基本上是实现它的唯一方法。这就是我为没有反向移植方法的旧红宝石实现它的方式。

于 2013-03-22T06:28:09.393 回答