在另一个对象的上下文中执行lambda

时间:2014-11-17 17:39:17

标签: ruby

似乎proc可以在另一个对象中执行,但lambda不能。

[1] pry(main)> class A; def a; 5; end; end
[2] pry(main)> pr = proc { a + 1 } # => #<Proc:0x007f5024264668@(pry):2>
[3] pry(main)> la = -> { a + 1 }   # => #<Proc:0x007f5023fc0e48@(pry):3 (lambda)>
[4] pry(main)> A.new.instance_eval &pr
=> 6
[5] pry(main)> A.new.instance_eval &la
ArgumentError: wrong number of arguments (1 for 0)
from (pry):3:in `block in __pry__'
[6] pry(main)> 

在这个例子中,还有其他方法可以像执行proc一样执行lambda,还是应该在类似的情况下使用procs?

1 个答案:

答案 0 :(得分:7)

这里的问题是instance_eval的接收者作为参数传递给块。 Procs允许未声明的参数,lambdas不允许。

pr = proc {|*args| p args; a + 1 }
A.new.instance_eval &pr
[#<A:0x43668596>]
 => 6

如果你声明你的lambda接收一个参数,它就可以正常工作:

> la = ->(recv) { a + 1 }
> A.new.instance_eval &la
 => 6

你可以(也可能想)使用instance_exec代替:

> la = -> { a + 1 }
> A.new.instance_exec &la
  => 6
> la = ->(add) { a + 1 + add }
> A.new.instance_exec 10, &la
  => 16