2013-05-14 11 views
5

Żeby było jasne - ten kod działa doskonale - code with procDzwoniąc instance_eval (& lambda) przekazać bieżący kontekst dostaje błąd „zła liczba argumentów”

ale jeśli zamiast zmienić Proc.new lambda, jestem otrzymuję błąd

ArgumentError: wrong number of arguments (1 for 0) 

Może to dlatego instance_eval chce przekazać siebie jako param, i traktuje jako metoda lambda i nie akceptuje nieznanych params?

Istnieją dwa przykłady - pierwszy robocze:

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 

drugie nie brzmi:

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 

Dzięki

Odpowiedz

4

jesteś rzeczywiście poprawne w swoim założeniu. Self jest przekazywane do Proc i do lambda, ponieważ jest to instance_eval 'wyd. Główną różnicą między Procs i lambdas jest to, że lambdas sprawdza arność bloku, który jest do nich przekazywany.

Więc:

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 

Tutaj Powiedziałem lambda oczekiwać blok z liczbę operandów 1 i jak widać w inspekcji argument, argument rzeczywiście jest instancją klasy Person self.

+0

Czy to nie 'p.get_rule' zamiast' p.init_rule'? – artificis

Powiązane problemy