当使用Proc#调用在Ruby中调用lambda函数时,self
总是会得到函数定义时的值,而不是调用函数时的值,例如:
$p = lambda { self }
class Dummy
def test
$p.call
end
end
d = Dummy.new
> d.test
=> main
Run Code Online (Sandbox Code Playgroud)
当我打算test
返回时main
,调用返回是#<Dummy:0xf794>
- 一个实例Dummy
,它是self
我调用的代码中的值的值$p
.
在Javascript中,我只是将我想成为"被调用者"的对象作为第一个参数传递给call
.Ruby中是否有这样的功能,允许我设置一个任意对象,或者至少是当前值self
,作为self
我调用时的新值Proc
?
Mar*_*llo 24
您正在寻找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>
Run Code Online (Sandbox Code Playgroud)
shw*_*ard 22
您可能希望使用instance_exec,因为它允许您将参数传递给块,而instance_eval则不允许.
def eval_my_proc_with_args(*args, &block)
instance_exec(*args, &block)
end
Run Code Online (Sandbox Code Playgroud)