अचानक, क्या रूबी की विधियां उपयोगी नहीं हैं? कोड लिखते समय, यह किसी ऑब्जेक्ट के लिए उपलब्ध सभी तरीकों और गुणों को सूचीबद्ध करता है और आपको उनके माध्यम से खोज करने की अनुमति देता है, जो डिबगिंग के लिए बहुत उपयोगी है।
इसके अलावा, यह रेल जैसे ढांचे के लिए विशिष्ट तरीकों की जांच करने, कोड पढ़ने और पुस्तकालयों को समझने में सहायता के लिए भी प्रभावी है। हालांकि आधिकारिक दस्तावेज या स्रोत कोड को संदर्भित करना अच्छा अभ्यास है, लेकिन विधियां विधि उन पुस्तकालयों के लिए काफी उपयोगी है जहां आपको गहराई से गोता लगाने की आवश्यकता नहीं है या जब आपके पास विधि नामों की अस्पष्ट यादें हैं।
रूबी की विधियों की विधि को संक्षेप में प्रस्तुत करने के लिए, यह इस तरह दिखता है:
ऑब्जेक्ट#विधि
ओबीजे के सार्वजनिक और संरक्षित तरीकों के नामों की एक सूची लौटाता है। इसमें ओबीजे के पूर्वजों में उपलब्ध सभी विधियां शामिल होंगी। यदि वैकल्पिक पैरामीटर गलत है, तो यह ओबीजे की सार्वजनिक और संरक्षित सिंगलटन विधियों की एक सरणी देता है, सरणी में ओबीजे में शामिल मॉड्यूल में विधियां शामिल नहीं होंगी।
दूसरे शब्दों में, यह रिसीवर से पहुंच योग्य गुणों और विधियों की एक सरणी ऑब्जेक्ट लौटाता है।
यह विधि ऑब्जेक्ट क्लास में कार्यान्वित की जाती है, जो ऑब्जेक्ट से प्राप्त सभी वर्गों का पूर्वज है, इसलिए इसका उपयोग ऑब्जेक्ट से प्राप्त किसी भी वर्ग में किया जा सकता है।
नमूना कोड
class Hoge attr_accessor :fuga def bar puts '' end end puts Hoge.new.methods // => [:bar, :fuga=, :fuga, :hash, :singleton_class, :dup, ...] puts Hoge.new.grep /fuga/ // => [:fuga=, :fuga]
जैसा कि उदाहरण में दिखाया गया है, यह एक ऐरे ऑब्जेक्ट लौटाता है, इसलिए आप grep विधि का उपयोग करके तरीकों की सूची भी खोज सकते हैं, जो बहुत सुविधाजनक है।
इसलिए, मैंने सोचा कि क्या यह जेएस में किया जा सकता है और इसे आज़माया।
नीचे वास्तविक कोड है।
क्लास का नाम कुछ भी हो सकता है, लेकिन मैं इसे अभी प्रॉपर्टीफाइंडर नाम दे रहा हूं।
class PropertyFinder { constructor(receiver) { this.receiver = receiver } grep(regexp, options = {}) { let res = [] if (typeof regexp === 'string') { return this.find((name) => name.includes(regexp)) } if (regexp instanceof RegExp) { return this.find((name) => regexp.test(name)) } return [] } toString() { return this.find(() => true) } find(detect) { const list = Object.getOwnPropertyNames(this.receiver).filter(it => detect(it)) if (!this.receiver.__proto__) { return list } const ancestors = new PropertyFinder(this.receiver.__proto__).find(detect) return [...list, ...ancestors] } }
मैं कोड को बाद में समझाऊंगा, लेकिन आइए इसका उपयोग कैसे करें से शुरू करें।
एक बार क्लास परिभाषित हो जाने के बाद, आप ऑब्जेक्ट क्लास के गुणों में निम्नानुसार एक विधि जोड़ सकते हैं:
Object.prototype.methods = function () { return new PropertyFinder(this) }
ऐसा करने से, आप ऑब्जेक्ट से प्राप्त कक्षाओं के उदाहरणों पर मेथड्स विधि का उपयोग कर सकते हैं। हालाँकि, कृपया नीचे दिए गए सावधानी नोट से अवगत रहें और इसका उपयोग अपने जोखिम पर करें।
यहां कुछ उदाहरण निष्पादन हैं:
class Hoge { fuga() { console.log('fuga') } } console.log(new Object().methods().toString()) // => ['constructor', 'constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty' ...] console.log([].methods().toString()) // => ['length', 'length', 'constructor', 'at', 'concat', ...] console.log(new Hoge().methods().grep(/fuga/) // => ['fuga']
*यह कोड उत्पादन परिवेश में उपयोग के लिए अनुशंसित नहीं है *
मंकी-पैचिंग के माध्यम से उच्च-स्तरीय कक्षाओं में गुण जोड़ना एक विरोधी पैटर्न है और जेएस विनिर्देशों में भविष्य में बदलाव के साथ समस्याएं पैदा हो सकती हैं। इसका उपयोग सावधानी से और अपने जोखिम पर करें।
संदर्भ : बंदर पैचिंग के नुकसान
अब, कोड को समझाने के लिए आगे बढ़ते हैं।
प्रॉपर्टीफ़ाइंडर में सबसे महत्वपूर्ण विधि खोज विधि है। यह विधि दिए गए ऑब्जेक्ट की प्रोटोटाइप श्रृंखला का पता लगाती है, सुलभ गुणों की खोज करती है, और उन्हें एक सूची के रूप में लौटाती है।
टूस्ट्रिंग और ग्रेप विधियां केवल खोज का उपयोग करती हैं, इसलिए उन्हें और स्पष्टीकरण की आवश्यकता नहीं है।
प्रोटोटाइप श्रृंखला कुछ लोगों के लिए अपरिचित हो सकती है, लेकिन यह ऑब्जेक्ट वर्ग से गुणों की विरासत है।
विरासत और प्रोटोटाइप श्रृंखला | एमडीएन
विवरण एमडीएन दस्तावेज़ में शामिल हैं, लेकिन जावास्क्रिप्ट की विरासत तंत्र प्रोटोटाइप श्रृंखला द्वारा समर्थित है।
हालांकि यह हमेशा स्पष्ट नहीं होता है, जब किसी संपत्ति का जिक्र होता है, तो प्रक्रिया में शामिल होता है:
यह प्रक्रिया श्रृंखला में तब तक जारी रहती है जब तक कि कोई मिलान नहीं मिल जाता, जिसे फिर वापस कर दिया जाता है।
उपरोक्त को देखते हुए, प्रॉपर्टीफाइंडर में खोज विधि इस तंत्र को लागू करती है, जिससे आप __proto__ को पुनरावर्ती रूप से खोजकर संपत्तियों की एक सूची प्राप्त कर सकते हैं।
यहां वह कार्यान्वयन है जो सूची प्राप्त करने के लिए __proto__ को पुनरावर्ती रूप से खोजकर इसे प्राप्त करता है:
find(detect) { const list = Object.getOwnPropertyNames(this.receiver).filter(it => detect(it)) if (!this.receiver.__proto__) { return list } const ancestors = new PropertyFinder(this.receiver.__proto__).find(detect) return [...list, ...ancestors] }
यह प्रॉपर्टीफाइंडर की व्याख्या को समाप्त करता है।
यह कोड की व्याख्या और मैंने जो प्रयास किया है उसे समाप्त करता है।
यह एक प्रयोगात्मक या चंचल अभ्यास था, लेकिन चूंकि इसमें कुछ ज्ञान और तकनीकें शामिल थीं, मुझे आशा है कि आप इसे अपने अनुप्रयोगों के लिए उपयोगी या प्रेरणादायक पाएंगे।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3