2013-05-14 5 views
5

Per essere chiari - questo codice viene eseguito perfettamente - code with procquando si chiama instance_eval (e lambda) per passare contesto attuale ha ricevuto l'errore 'numero errato di argomenti'

ma se invece cambio Proc.new a lambda, io sono ottenere un errore

ArgumentError: wrong number of arguments (1 for 0) 

Può essere questo è dovuto al fatto instance_eval vuole passare sé come param, e tratta lambda come un metodo e non accetta params sconosciuti?

ci sono due esempi - prima sta lavorando:

class Rule 
    def get_rule 
    Proc.new { puts name } 
    end 
end 

class Person 
    attr_accessor :name 

    def init_rule 
    @name = "ruby" 
    instance_eval(&Rule.new.get_rule) 
    end 
end 

seconda no:

class Rule 
    def get_rule 
    lambda { puts name } 
    end 
end 

class Person 
    attr_accessor :name 

    def init_rule 
    @name = "ruby" 
    instance_eval(&Rule.new.get_rule) 
    end 
end 

Grazie

risposta

4

si sono effettivamente corretto nella tua ipotesi. Il Sé viene passato allo Proc e al lambda come lo è instance_eval 'ed. Una grande differenza tra Procs e lambda è che lambda controlla l'appartenenza del blocco che sta per essere passato a loro.

Quindi:

class Rule 
    def get_rule 
    lambda { |s| puts s.inspect; puts name; } 
    end 
end 

p = Person.new 
p.get_rule 

#<Person:0x007fd1099f53d0 @name="ruby"> 
ruby 

Qui ho detto lambda di aspettarsi un blocco con arity 1 e, come si vede nel controllo argomento, l'argomento è davvero l'istanza self della classe Persona.

+0

Non è "p.get_rule' invece di' p.init_rule'? – artificis