2012-11-05 6 views
11

मैं अगर मैंरूबी अनबाउंड तरीके: क्या अन्य वर्गों के उदाहरणों से जुड़ना संभव है? बाँध तर्क यह बहुत ही विषय में मैं क्या कर सकता सीमित मुझे लगता है एक</p> <p>का एक उदाहरण होना चाहिए:

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.instance_method(:bomb) 

b = B.new 
bomb.bind(b) 

को होने के लिए मजबूर कर सकता है वर्तमान में यह त्रुटि लेखन त्रुटि फेंकता जानना चाहते हैं इन अनबाउंड विधियों के साथ, संभावनाएं थोड़ा सीमित हैं। इन मामलों में (और मैं केवल बेवकूफ कार्यों का जिक्र नहीं कर रहा हूं) यह सही समझ में आएगा? और एक निष्पादन त्रुटि पर्याप्त हो गई होगी, अगर मैं ए से वैरिएबल को संभालेगा जो बी में दोहराया नहीं गया है, तो मैं वास्तव में जानना चाहता हूं कि इस बाध्य को कैसे मजबूर किया जाए।

+0

कुछ दिलचस्प है कि संभव है: 'Object.instance_method (: to_s)। (" हैलो दुनिया ") .bind फोन # =>" # <स्ट्रिंग: 0x0000000195e1f0> "'। मुझे नहीं लगता कि यद्यपि आपके उदाहरण में बाइंडिंग को मजबूर करना संभव है। –

+2

हां, ऐसा इसलिए है क्योंकि स्ट्रिंग ऑब्जेक्ट से विरासत में है, और आप अपने बच्चों के वर्ग के उदाहरणों के लिए सुपरक्लास इंस्टेंस विधियों को बाध्य कर सकते हैं। एक उदाहरण: कक्षा ए; डीएफ टी; "ए" ; समाप्त ; समाप्त ; कक्षा बी <ए; डीएफ टी; "बी"; समाप्त ; समाप्त ; A.instance_method (: टी)। बाइंड (बीन्यू)। कॉल। लेकिन फिर भी, मैं विधि को एक फ़ंक्शन और फिर एक प्रोसेस बनाना चाहता हूं और फिर जहां चाहूं उसे कॉल करूँगा। लेकिन शायद मैं एक सपने देखने वाला हूं :) – ChuckE

+0

यदि 'ए' 'मॉड्यूल' होता, तो यह रूबी 2 में संभव है –

उत्तर

2

आप किसी अन्य वर्ग की विधि के साथ कक्षा के उदाहरण को बाध्य नहीं कर सकते हैं। उदाहरण के बिना इस वर्ग, या इसके उप-वर्गों का एक वस्तु है।

और यह भी स्पष्ट है, एक वर्ग का विवरण अन्य वर्ग के उदाहरण में स्थानांतरित नहीं किया जा सकता है। यह केवल उस उदाहरण के साथ बाध्य किया जा सकता है जो उस जानकारी को ले जाने के लिए अधिकृत है, उस वर्ग या उसके उप-वर्ग का उदाहरण।

इसलिए रूबी भी किसी अन्य वर्ग के उदाहरण के लिए विशिष्ट वर्ग की बाध्यकारी विधि द्वारा encapsulation को बनाए रखता है।

0

विधि और अनबाउंड विधि प्रकार अपेक्षा करते हैं कि बाध्य लक्ष्य मूल वर्ग का उप-वर्ग होना चाहिए जहां आपने विधि का संदर्भ दिया है। विधि को विधि में कनवर्ट करना उपclass बाधा से छुटकारा पाता है, लेकिन केवल विधि to_proc विधि लागू होती है।

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.new.method(:bomb) 

B.send(:define_method, :bomb_in_b, &bomb) #converting to proc 

b = B.new 
puts b.bomb_in_b 

रूबी में परीक्षण किया गया 2.2.3

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