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는 선언되지 않은 인수를 허용하지만 람다는 그렇지 않습니다. 당신이 인수를 수신하도록 당신의 람다를 선언하면

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 
관련 문제