2013-03-08 9 views

risposta

13

instance_eval sta cedendo self (User) alla lambda. Lambdas è particolare riguardo ai suoi parametri - allo stesso modo dei metodi - e solleverà uno ArgumentError se ce ne sono troppo pochi/molti.

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 

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

+1

Rilevante anche: http://stackoverflow.com/questions/12648157/instance-evals-block-arguments-documented-purpose – rampion

+0

Nella mia versione lambda non sta prendendo alcun argomento. E non ne sto passando nessuno al momento di instance_eval. Quindi, perché questo numero di argomenti non corrisponde. –

+0

'instance_eval' sta cedendo al proc/lambda. – pdoherty926

4

Se si vuole ancora utilizzare lambda, questo codice funziona:

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

instance_exec contrariamente a instance_eval non fornirà self come argomento per il blocco specificato, quindi wrong number of arguments (1 for 0) non verrà lanciato.

Look here per ulteriori informazioni.

Problemi correlati