2013-05-14 34 views
5

Açık olmak gerekirse - code with procçağıran instance_eval (& lambda) hata var 'yanlış numara argümanları'

ama lambda Proc.new değiştirmek yerine, ben değilim - Bu kod mükemmel çalışıyor bir hata

ArgumentError: wrong number of arguments (1 for 0) 

alma instance_eval bir param olarak kendini geçmek istediği için bu olacak ve bir yöntem olarak lambda davranır ve bilinmeyen params kabul etmiyoruz miyim?

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 

saniye değil:

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 

Teşekkür

cevap

4

Sen varsayımı aslında doğru ilk çalışıyor -

iki örnek vardır. Kendini Proc'a ve lambdaya instance_eval 'ediciden geçiriliyor. Procs ve lambdas arasındaki büyük bir fark, lambdaların, bloğun kendilerine geçirilen aritesini kontrol etmeleridir.

Yani:

İşte
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 

Ben Arity 1 ile bir blok beklemek lambda anlattı ve argüman muayene görüldüğü gibi, argüman gerçekten Kişi sınıfının self örneğidir.

+0

"p.init_rule" yerine "p.get_rule" değil mi? – artificis

İlgili konular