使用Proc#call时为self提供价值

时间:2009-11-13 12:21:51

标签: ruby

当使用Proc#调用在Ruby中调用lambda函数时,self总是以定义函数时的值结束,而不是调用函数时的值,例如:

$p = lambda { self }

class Dummy
  def test
    $p.call
  end
end

d = Dummy.new

> d.test
=> main

调用test会返回main,当我打算返回的内容为#<Dummy:0xf794>时,Dummy的实例,self的值为$p我调用call的代码中的点。

在Javascript中,我只是将我想成为“被调用者”的对象作为self的第一个参数传递。 Ruby中是否有任何此类功能,允许我在调用self时将Proc的任意对象设置为{{1}}的新值? / p>

3 个答案:

答案 0 :(得分:22)

您正在寻找instance_eval,它在调用对象的上下文中计算lambda。

>> $p = proc { self }
=> #<Proc:0x95cece4@(irb):1 (lambda)>
>> class Dummy
>>   def test
>>     $p.call
>>   end
>> 
>>   def test1
>>     instance_eval(&$p)
>>   end
>> end

>> d = Dummy.new
=> #<Dummy:0x946f7c8>
>> d.test
=> main
>> d.test1
=> #<Dummy:0x946f7c8>

答案 1 :(得分:21)

您可能希望使用instance_exec,因为它允许您将参数传递给块,而instance_eval则不允许。

def eval_my_proc_with_args(*args, &block)
  instance_exec(*args, &block)
end

答案 2 :(得分:1)

lambda定义了一个闭包,这意味着它将封装它在定义时所具有的环境。如果你想让self成为调用者,只需定义一个常规方法,或者更好地使用一个块。