2014-11-17 2 views
1

Похоже, что proc может быть выполнен в другом объекте, но лямбда не может.Выполнение лямбда в контексте другого объекта

[1] pry(main)> class A; def a; 5; end; end 
[2] pry(main)> pr = proc { a + 1 } # => #<Proc:[email protected](pry):2> 
[3] pry(main)> la = -> { a + 1 } # => #<Proc:[email protected](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)> 

Есть ли другой способ для лямбды быть выполнен как прок в этом примере, или я должен всегда использовать проки вместо в таких ситуациях?

ответ

5

Проблема заключается в том, что приемник instance_eval передается блоку в качестве аргумента. Procs допускают необъявленные аргументы, lambdas - нет.

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

Если объявить лямбда таким образом, что он получает аргумент, она работает просто отлично:

> 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