2011-06-13 9 views
5

जब रन टाइम आत्मनिरीक्षण और गतिशील कोड पीढ़ी की बात आती है तो मुझे नहीं लगता कि रूबी के पास कुछ लिस्पी बोलीभाषाओं को छोड़कर संभवतः कोई प्रतिद्वंद्वियों है। दूसरे दिन मैं रूबी की गतिशील सुविधाओं का पता लगाने के लिए कुछ कोड अभ्यास कर रहा था और मैंने मौजूदा वस्तुओं के तरीकों को जोड़ने के तरीकों के बारे में आश्चर्यचकित होना शुरू कर दिया।रूबी ऑब्जेक्ट में विधियों को कितने तरीकों से जोड़ा जा सकता है?

obj = Object.new 

# add a method directly 
def obj.new_method 
    ... 
end 

# add a method indirectly with the singleton class 
class << obj 
    def new_method 
    ... 
    end 
end 

# add a method by opening up the class 
obj.class.class_eval do 
    def new_method 
    ... 
    end 
end 

यह तो केवल शुरुआत भर है, क्योंकि मैं अभी भी instance_eval, module_eval और define_method के विभिन्न संयोजनों छानबीन नहीं की है: यहाँ 3 तरीके मैं के बारे में सोच सकते हैं। क्या कोई ऑनलाइन/ऑफ़लाइन संसाधन है जहां मैं ऐसी गतिशील चाल के बारे में अधिक जानकारी प्राप्त कर सकता हूं?

उत्तर

3

हैं obj एक सुपर क्लास है, तो आपको सुपर क्लास define_method(API) का उपयोग कर के रूप में आप का उल्लेख से obj तरीके जोड़ सकते हैं। यदि आप कभी भी रेल स्रोत कोड देखते हैं, तो आप देखेंगे कि वे इसे थोड़ा सा करते हैं।

इसके अलावा, जबकि यह आपके लिए वास्तव में क्या नहीं पूछ रहे हैं है, आप आसानी से गतिशील method_missing का उपयोग करके तरीकों में से एक लगभग अनंत संख्या बनाने का आभास दे सकते हैं:

def method_missing(name, *args) 
    string_name = name.to_s 
    return super unless string_name =~ /^expected_\w+/ 
    # otherwise do something as if you have a method called expected_name 
end 

जोड़ा जा रहा है कि अपने वर्ग के लिए होगा यह किसी भी विधि कॉल जो दिखता है

तरह
@instance.expected_something 
2

मैं किताब Metaprogramming Ruby जो गैंती किताब के प्रकाशकों द्वारा प्रकाशित किया जाता पसंद करने के लिए प्रतिक्रिया करने के लिए अनुमति देते हैं।

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