2010-07-03 13 views
17

रूबी में मेटाप्रोग्रामिंग बहुत अच्छा है क्योंकि मैं लगातार प्रोटोटाइप आधारित प्रोग्रामिंग अनुकरण करने के लिए इसका उपयोग करता हूं और अपनी व्यवहार्यता का परीक्षण करने के लिए कुछ समस्याओं के लिए प्रोटोटाइप समाधान लिखता हूं।रूबी सिंगलटन विधियों (class_eval, define_method) बनाम (example_eval, define_method)

(class << some_object; self; end).class_eval do 
    define_method(:method_name) do ... method body ... end 
end 

और

(class << some_object; self; end).instance_eval do 
    define_method(:method_name) do ... method body ... end 
end 

कोड के दोनों संस्करणों की एक सिंगलटन विधि को परिभाषित करने और मैं अभी तक नहीं आया है तो मैं अगर वहाँ कोड के निम्न भाग के बीच कोई अंतर नहीं है आवश्यक जानना चाहते हैं किसी भी चीज के खिलाफ जिसने मुझे (instance_eval, define_method) संयोजन को (class_eval, define_method) संयोजन पर एक सिंगलटन विधि को परिभाषित करने के लिए मजबूर किया है और मुझे आश्चर्य है कि दोनों के बीच कुछ आवश्यक अंतर है या नहीं।

+1

ध्यान दें कि ऊपर करने के लिए सबसे अच्छा तरीक़ा है 'define_singleton_method (:: METHOD_NAME) करते हैं ... end'

यह ओ के eigenclass पर एक वर्ग विधि है –

उत्तर

21

define_method के लिए कोई अंतर नहीं। लेकिन जब आप def का उपयोग करते हैं तो एक अंतर होता है।

o = Object.new 

# class_eval example 
class << o; self; end.class_eval { def test1; :test1; end } 
o.test1 #=> test1 

# instance_eval example 
class << o; self; end.instance_eval { def test2; :test2; end } 
o.test2 #=> NoMethodError 

क्यों def और define_method के बीच व्यवहार में अंतर? define_method एक विधि कॉल है और इसलिए eval संदर्भ में self पर चल रहा है। instance_eval और class_eval दोनों में समान है - यह रिसीवर (ओ का ईजिनक्लास) है।

हालांकि def अलग-अलग व्यवहार करता है, यह self पर काम नहीं करता है बल्कि इसके बजाय default definee पर काम नहीं करता है। class_eval के मामले में default defineeself जैसा ही है लेकिन instance_eval के लिए यह self का मेटाक्लास है।

हम ऊपर परिभाषित test2 विधि का उपयोग कैसे करते हैं? test2 o के eigenclass के मेटाक्लास पर परिभाषित एक उदाहरण विधि होना चाहिए।

class << o; test2; end #=> :test2 
संबंधित मुद्दे