2013-03-08 7 views

Odpowiedz

13

instance_eval otrzymuje self (User) do lambda. Lambdas są szczególnie zainteresowani swoimi parametrami - w ten sam sposób są to metody - i podniosą liczbę ArgumentError, jeśli jest ich zbyt mało/wiele.

class User 
    code1 = Proc.new { |x| x == User } # true 
    code2 = lambda { |x| x == User } # true 

    define_method :test do 
    self.class.instance_eval &code1 
    self.class.instance_eval &code2 
    end 
end 

Stosowna: What's the difference between a proc and a lambda in Ruby?

+1

Również istotne: http://stackoverflow.com/questions/12648157/instance-evals-block-arguments-documented-purpose – rampion

+0

W mojej wersji lambda nie przyjmuje żadnych argumentów. I nie przekazuję żadnych w czasie wystąpienia klasy instance_eval. Dlaczego więc ten numer argumentów jest niezgodny? –

+0

'instance_eval' oddaje samo do proc/lambda. – pdoherty926

4

Jeśli nadal chcesz używać lambda, ten kod działa:

block = lambda { "Hello" } # or -> { "Hello" } 
some_obj.instance_exec(&block) 

instance_exec wbrew instance_eval nie dostarczy self jako argument do danego bloku, więc wrong number of arguments (1 for 0) nie zostanie rzucony.

Sprawdzić numer here, aby uzyskać więcej informacji.

Powiązane problemy