2013-05-14 8 views
5

स्पष्ट है - इस कोड को पूरी तरह से चल रहा है - code with procजब बुला instance_eval (और लैम्ब्डा) वर्तमान संदर्भ पारित करने के लिए त्रुटि मिली 'की गलत संख्या तर्क'

लेकिन अगर बजाय मैं लैम्ब्डा को Proc.new बदलने के लिए, मैं कर रहा हूँ एक त्रुटि

ArgumentError: wrong number of arguments (1 for 0) 

हो रही हो सकता है इस वजह से instance_eval का कोई पैरामीटर के रूप में स्वयं को पारित करने के लिए करना चाहता है, और एक विधि के रूप में लैम्ब्डा व्यवहार करता है और अज्ञात पैरामीटर को स्वीकार नहीं करते?

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 

दूसरा नहीं है::

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 

धन्यवाद

उत्तर

4

आप वास्तव में अपने धारणा में सही कर रहे हैं पहले काम कर रहा है -

दो उदाहरण नहीं है। स्वयं को Proc और लैम्ब्डा में पास किया जा रहा है क्योंकि यह instance_eval 'ed है। प्रोसेस और लैम्बडास के बीच एक बड़ा अंतर यह है कि लैम्बडास उन्हें पारित होने वाली ब्लॉक की धैर्य की जांच करता है।

तो:

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 

यहाँ मैं लैम्ब्डा arity 1 के साथ एक ब्लॉक की उम्मीद करने के लिए कहा और के रूप में आप तर्क निरीक्षण में देखते हैं, तर्क वास्तव में व्यक्ति वर्ग की self उदाहरण है।

+0

क्या यह 'p.init_rule' के बजाय 'p.get_rule' नहीं है? – artificis

संबंधित मुद्दे