2013-03-08 7 views
7

मैं निम्नलिखित वर्ग है:example_eval प्रो के साथ क्यों सफल होता है लेकिन लैम्ब्डा के साथ नहीं?

class User 
    code1 = Proc.new { } 
    code2 = lambda { } 

    define_method :test do 
    self.class.instance_eval &code1 
    self.class.instance_eval &code2 
    end 
end 

User.new.test 

क्यों दूसरा instance_eval एक wrong number of arguments (1 for 0) त्रुटि के साथ विफल करता है?

उत्तर

13

instance_eval लैम्बडा में self (User) उपज कर रहा है। Lambdas उनके पैरामीटर के बारे में विशेष हैं - वैसे ही तरीके हैं - और ArgumentError उठाएंगे यदि बहुत कम/बहुत हैं।

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 

प्रासंगिक: What's the difference between a proc and a lambda in Ruby?

+1

यह भी प्रासंगिक: http://stackoverflow.com/questions/12648157/instance-evals-block-arguments- दस्तावेज-purpose – rampion

+0

मेरे संस्करण में लैम्ब्डा कोई तर्क नहीं ले रहा है। और मैं example_eval के समय किसी भी पास नहीं जा रहा हूँ। तो तर्क संख्या का यह मुद्दा क्यों मेल नहीं खाता है। –

+0

'instance_eval' proc/lambda को स्वयं उत्पन्न कर रहा है। – pdoherty926

4

आप अभी भी लैम्ब्डा उपयोग करना चाहते हैं, इस कोड काम करेगा:

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

instance_exec विपरीत instance_eval दिए गए ब्लॉक करने के लिए एक तर्क के रूप self की आपूर्ति नहीं होगा करने के लिए, इसलिए wrong number of arguments (1 for 0) नहीं फेंक दिया जाएगा।

अधिक जानकारी के लिए here देखें।

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