似乎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?
答案 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