2009-12-11 28 views
41
obj = SomeObject.new 

def obj.new_method 
    "do some things" 
end 

puts obj.new_method 
> "do some things" 

यह ठीक काम करता है। हालांकि, मैं एक मौजूदा विधि के अंदर एक ही बात करने की जरूरत है:किसी ऑब्जेक्ट ऑब्जेक्ट में विधि जोड़ें

def some_random_method 
    def obj.new_method 
    "do some things" 
    end 
end 

ठीक काम करता है और साथ ही, लेकिन एक विधि के अंदर एक विधि होने सुंदर भयानक लग रहा है। सवाल यह है कि क्या ऐसी विधि जोड़ने का कोई वैकल्पिक तरीका है?

+0

क्या आप वाकई कोड के दूसरे टुकड़ा काम करता हैं: माणिक 1.9+ में, वहाँ define_singleton_method का उपयोग करके ऐसा करने का एक बेहतर तरीका इस प्रकार है,? क्योंकि मुझे लगता है कि इसे 'ओब्जे' को एक विधि तर्क के रूप में स्वीकार करना चाहिए ताकि पहले एक सिंगलटन विधि को परिभाषित किया जा सके। – Chirantan

उत्तर

66

यह एक लंबे समय के बाद से मैं इस पूछा गया है।

obj = SomeObject.new 

obj.define_singleton_method(:new_method) do 
    "do some things" 
end 
+2

यदि मैं इस 'डू' ब्लॉक के अंदर '@ field' का उपयोग करता हूं तो क्या होगा? क्या मैं वर्तमान कक्षा से एक क्षेत्र तक पहुंच सकता हूं, या क्या यह 'ओब्जे' के क्षेत्र का उपयोग करेगा? – ciembor

+1

वास्तव में इस ठीक से परीक्षण नहीं किया है, लेकिन जहां तक ​​मैं मिश्रण को बता सकता हूं और यह दृष्टिकोण बराबर नहीं है। इसके पास बाहरी मूल्यों तक पहुंच है, जबकि एक मिश्रण नहीं है। – vise

43

एक मिक्सिन का उपयोग करें।

module AdditionalMethods 
    def new_method 
    "do some things" 
    end 
end 

obj = SomeObject.new 
obj.extend(AdditionalMethods) 

puts obj.new_method 
> "do some things" 
6

आप मॉड्यूल का उपयोग कर सकते हैं।

module ObjSingletonMethods 
    def new_method 
    "do some things" 
    end 
end 


obj.extend ObjSingletonMethods 

puts obj.new_method # => do some things 

अब अगर आप उस वस्तु के लिए और अधिक तरीकों जोड़ने की जरूरत है, तो आप सिर्फ मॉड्यूल में तरीकों को लागू करने की जरूरत है और आप कर रहे हैं।

7

बस एक दिलचस्प बात गौर करने योग्य

यदि आप इसके बजाय चला गया था:

def my_method 
    def my_other_method; end 
end 

फिर my_other_method वास्तव में बर्दाश्त नहीं कि my_method के रिसीवर एक उदाहरण है वस्तु की श्रेणी पर परिभाषित किया जाएगा ।

लेकिन अगर तुम जाओ (तुमने किया था के रूप में):

def my_method 
    def self.my_other_method; end 
end 

फिर my_other_method उदाहरण के eigenclass पर परिभाषित किया गया है।

आपके सवाल का सीधे के लिए प्रासंगिक नहीं है, लेकिन एक तरह से दिलचस्प फिर भी;)

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