2011-10-04 8 views
11

जब मैं एक ऐसी विधि का आह्वान करता हूं जो अस्तित्व में नहीं है, method_missing मुझे विधि का नाम बताएगा। जब मैं एक चर को एक्सेस करने का प्रयास करता हूं जो सेट नहीं किया गया है, तो मान केवल nil है।क्या रूबी के पास अपरिभाषित इंस्टेंस चर के लिए विधि_missing समतुल्य है?

मैं गतिशील रूप से शून्य आवृत्ति चर तक पहुंच को अवरुद्ध करने का प्रयास कर रहा हूं और चर के नाम के आधार पर एक मान वापस कर रहा हूं। निकटतम समकक्ष PHP का __get होगा। रूबी में कोई समकक्ष कार्यक्षमता है?

+0

क्या आप चेतावनियों के बारे में जानते हैं और उन्हें कैसे चालू करें? –

उत्तर

0

कोई example_variable_missing नहीं है (कम से कम मुझे पता है) लेकिन आप यादृच्छिक रूप से नामित आवृत्ति चर का उपयोग क्यों कर रहे हैं?

यदि आपका थ्रेड विधि कॉल के माध्यम से ऑब्जेक्ट स्थिति तक पहुंच जाता है (जैसा कि आपको वैसे भी करना चाहिए) तो आपको इसकी आवश्यकता नहीं होगी।

यदि आप विधि लुकअप के साथ गड़बड़ किए बिना जादू सामग्री को परिभाषित करने का कोई तरीका ढूंढ रहे हैं, तो आप const_missing का उपयोग करना चाह सकते हैं।

+0

चर को यादृच्छिक रूप से नामित नहीं किया गया है। मैं परीक्षण प्रयोजनों के लिए आवृत्ति चर सेट करने के लिए ज़िम्मेदार मेलर के बिना बिना किसी ईमेल को प्रस्तुत करने के साथ खेल रहा हूं। दृश्य '@ user.name' जैसी चीज़ों तक पहुंचने का प्रयास करेगा, बिना उपयोगकर्ता @ सेट '। मैंने सोचा कि मैं पहले पढ़ने पर '@ user' जैसी चीज़ों के लिए फैक्ट्रीगर्ल ऑब्जेक्ट्स को गतिशील रूप से उत्पन्न करने में सक्षम हो सकता हूं। – meagar

+0

मुझे धन्यवाद दिखाई देता है। AFAICT मुझे डर है कि आपका एकमात्र विकल्प टेम्पलेट फ़ाइल को पढ़ना है और तदनुसार वर्र्स सेट करना है (या संभवतः समस्या को चारों ओर घुमाएं और अपने ईमेल टेम्पलेट में 'method_missing' का उपयोग करें)। जब आप एक अपरिभाषित चर का उपयोग कर रहे हैं और आपको चेतावनी देंगे तो रूबी के बाद भी शर्म की बात है। – riffraff

2

मुझे विश्वास नहीं है कि रूबी में यह संभव है। अनुशंसित तरीका आपके टेम्पलेट्स में '@user' 'उदाहरण var के बजाय' उपयोगकर्ता 'विधि का उपयोग करना होगा।

यह रूबी ऑब्जेक्ट्स के साथ बाहरी तरीके से निपटने के तरीके के अनुरूप है ('obj.user' 'एक विधि है जो' @user '' को संदर्भित करती है, लेकिन वास्तव में '@user' नहीं है)। यदि आपको किसी विशेषता के साथ किसी विशेष प्रकार की विशेष तर्क की आवश्यकता है, तो आपकी सर्वश्रेष्ठ शर्त किसी विधि (या method_missing) का उपयोग करना है, भले ही आप ऑब्जेक्ट के अंदर या बाहर से इसे एक्सेस कर रहे हों।

1

मेरा answer to another similar question देखें। लेकिन सिर्फ इसलिए कि आप कर सकते हैं इसका मतलब यह नहीं है कि यह एक अच्छा विचार है। संवेदनशील डिजाइन आम तौर पर इस तरह की चीज की आवश्यकता को दूर कर सकता है और आपको अधिक पठनीय और इसलिए बनाए रखने योग्य कोड उत्पन्न करने की अनुमति देता है।

instance_variable_get जो मैं देख सकता हूं उससे PHP के __get के निकटतम समकक्ष प्रतीत होता है (हालांकि मैं PHP उपयोगकर्ता नहीं हूं)।

relevant Ruby source code पर देखकर, चर के लिए एकमात्र 'गायब' विधि const_missing स्थिरांक के लिए है, उदाहरण चर के लिए कुछ नहीं।

+1

मदद नहीं करता है। मुझे अपने सभी इंस्टेंस वैरिएबल उपयोगों को विधि कॉल में बदलना होगा, जो पूरी तरह से अव्यवहारिक है। – meagar

+0

वैसे, रूबी में उस अन्य उत्तर में वर्णित उदाहरण के अलावा गतिशील रूप से उदाहरण चर के उपयोग के लिए ऐसी कोई सुविधा नहीं है। ऊपर अद्यतन उत्तर देखें। – arcresu

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