2010-08-20 13 views
5

मैं प्रॉक्सी ऑब्जेक्ट बनाने की कोशिश कर रहा हूं जो लगभग सभी विधि कॉल को बच्चे ऑब्जेक्ट में स्थानांतरित करता है, अनिवार्य रूप से प्रतिनिधिमंडल पैटर्न। अधिकांश भाग के लिए, मैं केवल मूल ऑब्जेक्ट का उपयोग कर रहा हूं और बाल ऑब्जेक्ट में method_missing के साथ हर कॉल को पास कर रहा हूं। अब तक सब ठीक है.रूबी के केस ऑपरेटर को मूर्ख बनाना, ===, प्रॉक्सी ऑब्जेक्ट्स

चाल, कि के रूप में मैं हो सकता है की कोशिश है मैं रूबी के मामले ऑपरेटर मूर्ख नहीं कर सकते, तो मैं ऐसा नहीं कर सकते:

x = Proxy.new(15) 
Fixnum === x #=> false, no matter what I do 

निश्चित रूप से यह किसी भी case x कार्रवाई विफल बनाता है, जो प्रॉक्सी कर सकते हैं इसका मतलब है अन्य पुस्तकालयों को सुरक्षित रूप से बंद नहीं किया जाएगा।

मैं अपने जीवन के लिए नहीं कर सकता कि क्या === उपयोग कर रहा है।

x.is_a?(Fixnum) #=> true 
x.instance_of?(Fixnum) #=> true 
x.kind_of?(Fixnum) #=> true 
x.class #=> Fixnum 

Module#=== है सिर्फ इतना है कि टाला नहीं जा सकता जादू किसी तरह का कर रही: प्रॉक्सी वर्ग आधारित आत्मनिरीक्षण मैं के बारे में पता है, जो सभी सही ढंग से बच्चे वस्तु को पारित कर दिया है सभी के लिए ठीक काम करता है?

+0

चेतावनी का एक शब्द: यदि आप 'is_a? ',' Instance_of? ',' Kind_of? ',' Class' आदि को प्रस्तुत करके 'फिक्सम' के रूप में अपनी प्रॉक्सी को मास्कराइड किए बिना अपना लक्ष्य प्राप्त कर सकते हैं, तो कृपया ऐसा करें! इन तरीकों को बदलने से आपको नरक डीबग करने के लिए सीधे (या कोई आपके कोड का उपयोग/रखरखाव कर सकता है)। – molf

उत्तर

1

हाँ, यह है। Module#=== सी में लागू किया गया है, वस्तु के वर्ग पदानुक्रम की जांच सीधे। ऐसा लगता है कि इसे मूर्ख बनाने का कोई तरीका नहीं है।

+0

धन्यवाद। यह क्या ennui लाता है। – bhuga

0

मुझे लगता है कि आप जो खोज रहे हैं वह Delegator कक्षा है।

आपकी प्रॉक्सी क्लास को प्रतिनिधि वर्ग को उप-वर्ग करना चाहिए, फिर लक्षित ऑब्जेक्ट प्राप्त करने और सेट करने के लिए __getobj__ और __setobj__ को परिभाषित करना चाहिए।

भूल जाओ, मैंने इसे स्वयं करने की कोशिश की और यह काम नहीं करता है।

संपादित करें: === विधि:

रूप grddev का उल्लेख है, तकनीकी समस्या आई है Fixnum भेजा जा रहा है है। इसके बारे में सोचते हुए, मुझे लगता है कि रुबी का वर्तमान व्यवहार सही है। चूंकि एक प्रतिनिधि को कार्यान्वयन विवरण छुपाने के लिए एक अमूर्त इंटरफ़ेस माना जाता है, इसलिए प्रॉक्सी के उदाहरण सही प्रकार की पहचान नहीं किए जाते हैं? Fixnum।

यदि आप वास्तव में प्रॉक्सी क्लास को फिक्सनम का एक प्रकार होना चाहते हैं, लेकिन इसे विधियों के साथ सजाने की इच्छा रखते हैं, तो तार्किक चीज या तो फिक्सनम को उपclass करना है, या प्रॉक्सी मोड्स मॉड्यूल बनाना और फिक्सम के व्यक्तिगत उदाहरणों का विस्तार करना है।

बेशक, क्योंकि आप वास्तव में Fixnum.new नहीं कर सकते हैं, आपको एक उदाहरण को विस्तारित करने के लिए फिक्सम को उप-वर्ग करना होगा, लेकिन सामान्य नियम खड़ा है।

+0

तकनीकी व्यवहार केवल तभी सही होता है जब आप मानते हैं कि प्रोग्रामर के लिए ऑब्जेक्ट आत्मनिरीक्षण अनुपलब्ध है, जो ऐसा लगता है, सी में है। दुर्भाग्यवश इस प्रॉक्सी को किसी भी प्रकार की ऑब्जेक्ट को ट्रैक करने की आवश्यकता है, न केवल फिक्समम्स, इसलिए विस्तार से वास्तव में मदद नहीं करता है (और विभिन्न कारणों से, ऑब्जेक्ट का विस्तार करना भी उपयोगी नहीं है)। – bhuga

+0

ठीक है, मैं आपका बिंदु देखता हूं। आप उम्मीद करेंगे कि: === को आपके प्रॉक्सी ऑब्जेक्ट पर 'send: instance_of ?, MyClass'' पर लागू किया गया है, लेकिन वास्तव में यह मामला नहीं है। मैं अभी भी बनाए रखता हूं कि यदि आप किसी ऑब्जेक्ट के रूप में मास्कराइड करने की कोशिश कर रहे हैं, लेकिन किसी प्रकार की मेटा-कार्यक्षमता चाहते हैं, तो ट्रैकिंग ऑब्जेक्ट बनाना जो अलग-अलग ऑब्जेक्ट को सजाने और ट्रैक करता है, एक बेहतर डिज़ाइन है। गैर-सिंगलटन वस्तुओं को बढ़ाया जा सकता है, और सिंगलटन उदाहरण (उदाहरण के लिए फिक्सम और प्रतीक) को लपेटा और बढ़ाया जा सकता है, या विशिष्ट रूप से संभाला जा सकता है। – guns

0

समस्या यह है कि यह Fixnum === x करता है, जिसका अर्थ है कि === विधि Fixnum पर और x पर नहीं है। आप अस्तित्व में सभी === विधियों को प्रतिस्थापित कर सकते हैं, और यह भी देखें कि जब नई === विधियां पेश की जाती हैं), लेकिन यह बहुत काम होगा, और काफी नाजुक होगा।

0

आपको शायद ब्लैंकस्लेट कक्षा की खोज करनी चाहिए। यह वर्ग सामान्य ऑब्जेक्ट से अधिकांश विधियों को स्ट्रिप्स करता है और वेबसाइट में एक साधारण प्रॉक्सी क्लास का उदाहरण होता है जो सभी विधियों को बुलाएगा। यह शोल आपको क्या हो रहा है की एक बेहतर तस्वीर देता है। क्षमा करें मैं आपको एक पूर्ण उत्तर नहीं दे सकता लेकिन मैं अपने फोन पर हूं। उम्मीद है की वो मदद करदे।

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