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

Tob*_*hen 22 ruby

当使用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)

  • 当我尝试以这种方式将块发送到`instance_eval`时,我总是得到错误`ArgumentError:错误的参数个数(1表示0)`.我认为@ shwoodard的答案现在是正确的答案. (3认同)
  • 使用`proc`而不是`lamda`应该可以解决`ArgumentError:参数数量错误(1代表0)的异常。 (2认同)

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)