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

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

 $p = lambda { self } class Dummy def test $p.call end end d = Dummy.new > d.test => main 

调用test返回main ,当我打算返回的是#Dummy一个实例,它是代码中我称为$p的点的self值。

在Javascript中,我只是将我想成为“被调用者”的对象作为第一个call参数传递。 Ruby中是否有这样的function,允许我在调用Proc时将一个任意对象或至少是self的当前值设置为self的新值?

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

 >> $p = proc { self } => # >> class Dummy >> def test >> $p.call >> end >> >> def test1 >> instance_eval(&$p) >> end >> end >> d = Dummy.new => # >> d.test => main >> d.test1 => # 

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

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

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