मेरा प्रश्न " रूबी में शामिल और विस्तारित करने के बीच अंतर क्या है? " के समान है।
requireऔर includeरूबी में क्या अंतर है ? अगर मैं सिर्फ अपनी कक्षा में एक मॉड्यूल से विधियों का उपयोग करना चाहता हूं, तो मुझे requireयह करना चाहिए या includeयह?
मेरा प्रश्न " रूबी में शामिल और विस्तारित करने के बीच अंतर क्या है? " के समान है।
requireऔर includeरूबी में क्या अंतर है ? अगर मैं सिर्फ अपनी कक्षा में एक मॉड्यूल से विधियों का उपयोग करना चाहता हूं, तो मुझे requireयह करना चाहिए या includeयह?
जवाबों:
रूबी में "शामिल" और "आवश्यकता" के बीच क्या अंतर है?
उत्तर:
शामिल हैं और तरीकों की आवश्यकता बहुत अलग चीजें हैं।
आवश्यकता विधि वह करती है जो अधिकांश अन्य प्रोग्रामिंग भाषाओं में शामिल होती है: एक और फ़ाइल चलाएं। यह ट्रैक करता है कि आपने अतीत में क्या आवश्यक है और दो बार एक ही फ़ाइल की आवश्यकता नहीं होगी। इस अतिरिक्त कार्यक्षमता के बिना किसी अन्य फ़ाइल को चलाने के लिए, आप लोड विधि का उपयोग कर सकते हैं।
शामिल विधि अन्य मॉड्यूल से सभी तरीकों को लेती है और उन्हें वर्तमान मॉड्यूल में शामिल करती है। यह एक भाषा-स्तर की चीज़ है जो आवश्यकता के अनुसार फ़ाइल-स्तरीय चीज़ के विपरीत है। शामिल विधि अन्य मॉड्यूल (आमतौर पर मिक्स-इन के रूप में संदर्भित) के साथ वर्गों का "विस्तार" करने का प्राथमिक तरीका है। उदाहरण के लिए, यदि आपकी कक्षा "प्रत्येक" विधि को परिभाषित करती है, तो आप मिक्सिन मॉड्यूल को शामिल कर सकते हैं और यह संग्रह के रूप में कार्य कर सकता है। यह भ्रामक हो सकता है क्योंकि शामिल क्रिया अन्य भाषाओं में बहुत अलग तरीके से उपयोग की जाती है।
इसलिए यदि आप केवल एक मॉड्यूल का उपयोग करना चाहते हैं, बजाय इसे बढ़ाने या मिक्स-इन करने के, तो आप उपयोग करना चाहेंगे require।
अजीब तरह से, रूबी requireसी के अनुरूप है include, जबकि रूबी includeसी की तरह लगभग कुछ भी नहीं है include।
includeरूबी में सिर्फ विरासत है। (और) (पूर्व) के सुपरक्लास के सुपरक्लास class C; include M endबनाता है । मुझे नहीं लगता कि सी की विरासत के माध्यम से काम करता है, मुझे लगता है कि यह सरल शाब्दिक / शाब्दिक प्रतिस्थापन है। MCCMinclude
यदि आप एक मॉड्यूल का उपयोग कर रहे हैं, तो इसका मतलब है कि आप सभी तरीकों को अपनी कक्षा में ला रहे हैं। यदि आप extendएक मॉड्यूल के साथ एक वर्ग है, तो इसका मतलब है कि आप "मेथड इन" को क्लास के तरीकों के रूप में ला रहे हैं । यदि आप includeएक मॉड्यूल के साथ एक वर्ग, इसका मतलब है कि आप उदाहरण के तरीकों के रूप में मॉड्यूल के तरीकों में "ला रहे हैं" ।
पूर्व:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=> B: वर्ग के लिए अपरिभाषित विधि 'कहना'
B.new.say
=> यह मॉड्यूल ए है
C.say
=> यह मॉड्यूल ए है
C.new.say
=> सी: क्लास के लिए अपरिभाषित विधि 'कहना'
मेटाप्रोग्रामिंग रूबी पुस्तक से,
require()विधि काफी के समान हैload(), लेकिन यह एक अलग उद्देश्य के लिए है। आपload()कोड निष्पादित करने के लिए उपयोग करते हैं , और आपrequire()पुस्तकालयों को आयात करने के लिए उपयोग करते हैं।
रूबी requireअन्य भाषाओं (जैसे सी) में "शामिल" की तरह अधिक है। यह रूबी को बताता है कि आप किसी अन्य फ़ाइल की सामग्री में लाना चाहते हैं । अन्य भाषाओं में समान तंत्र हैं:
रूबी includeएक ऑब्जेक्ट-ओरिएंटेड इनहेरिटेंस मैकेनिज़्म है जिसका उपयोग मिक्सिन्स के लिए किया जाता है ।
यहाँ एक अच्छी व्याख्या है :
[] सरल उत्तर यह है कि आवश्यकता और शामिल अनिवार्य रूप से असंबंधित हैं।
"आवश्यकता" सी के समान है, जिसमें नौसिखिया भ्रम हो सकता है। (एक उल्लेखनीय अंतर यह है कि आवश्यकता होने पर आवश्यक फ़ाइल "लुप्त हो जाना" के अंदर स्थानीय लोग।)
रूबी शामिल सी की तरह कुछ भी शामिल नहीं है। एक वर्ग में एक मॉड्यूल में बयान "मिक्स इन" शामिल है। यह कई उत्तराधिकार का एक सीमित रूप है । एक शामिल मॉड्यूल शाब्दिक रूप से "ए-ए" रिश्ते को शामिल करता है, जिसमें यह शामिल है।
महत्व दिया।
क्या आपने कभी requireकिसी मॉड्यूल की कोशिश की है ? परिणाम क्या थे? कोशिश करो:
MyModule = Module.new
require MyModule # see what happens
मॉड्यूल की आवश्यकता नहीं हो सकती, केवल शामिल!
TypeErrorयदि शब्द Moduleबदल गया है तो उन्हें वही परिणाम ( ) प्राप्त होगा Class।
से प्रोग्रामिंग रूबी 1.9
हम जाने से पहले शामिल बयान के बारे में कुछ बिंदु देंगे। पहला, इसका फाइलों से कोई लेना-देना नहीं है। सी प्रोग्रामर संकलन के दौरान एक फ़ाइल की सामग्री को दूसरे में डालने के लिए #include नामक एक पूर्वप्रक्रमक निर्देश का उपयोग करते हैं। रूबी में केवल एक मॉड्यूल का संदर्भ दिया गया विवरण शामिल है। यदि वह मॉड्यूल एक अलग फ़ाइल में है, तो आपको शामिल करने से पहले उस फ़ाइल को खींचने के लिए आवश्यकता (या इसके कम इस्तेमाल होने वाले चचेरे भाई, लोड) का उपयोग करना होगा। दूसरा, एक रूबी में केवल मॉड्यूल की आवृत्ति विधियों को कक्षा में कॉपी करना शामिल नहीं है। इसके बजाय, यह वर्ग से शामिल मॉड्यूल के लिए एक संदर्भ बनाता है। यदि कई वर्गों में उस मॉड्यूल को शामिल किया जाता है, तो वे सभी एक ही चीज़ की ओर इशारा करेंगे। यदि आप एक मॉड्यूल के भीतर एक विधि की परिभाषा बदलते हैं, भले ही आपका कार्यक्रम चल रहा हो,
जब आप अपनी कक्षा में एक मॉड्यूल शामिल करें, जैसा कि नीचे दिखाया गया है, इसे शामिल करें जैसे कि आपने मॉड्यूल के भीतर परिभाषित कोड लिया और उसे कक्षा में सम्मिलित किया, जहाँ आप इसे शामिल करते हैं। यह 'मिक्सिन' व्यवहार की अनुमति देता है। इसका उपयोग आपके कोड को डुप्लिकेट से बचने के लिए किया जाता है, उदाहरण के लिए, यदि कई वर्ग थे जिन्हें मॉड्यूल के भीतर समान कोड की आवश्यकता होगी।
लोड लोड विधि लगभग आवश्यकता विधि की तरह है सिवाय इसके कि वह पुस्तकालय लोड किया गया है या नहीं, इसका ट्रैक नहीं रखता है। इसलिए पुस्तकालय को कई बार लोड करना संभव है और यह भी कि लोड विधि का उपयोग करते समय आपको लाइब्रेरी फ़ाइल नाम का ".rb" एक्सटेंशन निर्दिष्ट करना होगा।
आवश्यकता आवश्यकता विधि आपको लाइब्रेरी लोड करने की अनुमति देती है और इसे एक से अधिक बार लोड होने से रोकती है। यदि आप पहली बार के बाद उसी लाइब्रेरी को लोड करने का प्रयास करते हैं, तो आवश्यकता विधि 'झूठी' वापस आ जाएगी। आवश्यकता विधि का केवल उपयोग करने की आवश्यकता है यदि आपके द्वारा लोड की जा रही लाइब्रेरी को एक अलग फ़ाइल में परिभाषित किया गया है, जो आमतौर पर मामला है।
आप इसे http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/ पसंद कर सकते हैं
नीचे कुछ बुनियादी अंतर आवश्यक और शामिल हैं:
आवश्यक है:
शामिल:
require(name)
यह बोलियन को सही / गलत लौटाएगा
नाम जो आवश्यकता के पैरामीटर के रूप में पारित किया गया है, माणिक आपके लोड पथ में उस नाम के साथ स्रोत फ़ाइल खोजने की कोशिश करेगा। यदि आप पहली बार के बाद उसी लाइब्रेरी को लोड करने का प्रयास करते हैं, तो आवश्यकता विधि 'झूठी' वापस आ जाएगी। आवश्यकता विधि का केवल तभी उपयोग करने की आवश्यकता है यदि आपके द्वारा लोड की जा रही लाइब्रेरी को एक अलग फ़ाइल में परिभाषित किया गया है। इसलिए यह इस बात पर नज़र रखता है कि पुस्तकालय पहले से लोड था या नहीं।
include module_name
मान लीजिए अगर आपके पास कुछ विधियाँ हैं जो आपको दो अलग-अलग वर्गों में होनी चाहिए। फिर आपको उन्हें दोनों वर्गों में लिखने की जरूरत नहीं है। इसके बजाय आप क्या कर सकते हैं, इसे मॉड्यूल में परिभाषित करें। और फिर इस मॉड्यूल को अन्य वर्गों में शामिल करें। यह रूबी द्वारा DRY सिद्धांत को सुनिश्चित करने के लिए प्रदान किया गया है। इसका उपयोग आपके कोड को डुप्लिकेट से बचने के लिए किया जाता है
शामिल
जब आप
includeअपनी कक्षा में एक मॉड्यूल बनाते हैं, तो ऐसा लगता है जैसे आपने मॉड्यूल के भीतर परिभाषित कोड लिया और उसे कक्षा के भीतर डाला, जहाँ आप इसे शामिल करते हैं। यह 'मिक्सिन' व्यवहार की अनुमति देता है। उदाहरण के लिए, डुप्लिकेट से बचने के लिए इसका उपयोग आपके कोड को डीआरवाई अप करने के लिए किया जाता है, अगर कई वर्ग थे जिन्हें मॉड्यूल के भीतर समान कोड की आवश्यकता होगी।
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
# ...
end
tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error
आवश्यकता होती है
आवश्यकता विधि आपको एक पुस्तकालय लोड करने की अनुमति देती है और इसे एक से अधिक बार लोड होने से रोकती है। यदि आप पहली बार के बाद उसी लाइब्रेरी को लोड करने का प्रयास करते हैं, तो आवश्यकता विधि 'झूठी' वापस आ जाएगी। आवश्यकता विधि का केवल उपयोग करने की आवश्यकता है यदि आपके द्वारा लोड की जा रही लाइब्रेरी को एक अलग फ़ाइल में परिभाषित किया गया है, जो आमतौर पर मामला है।
इसलिए यह इस बात पर नज़र रखता है कि पुस्तकालय पहले से लोड था या नहीं। आपको लाइब्रेरी फ़ाइल नाम का ".rb" एक्सटेंशन निर्दिष्ट करने की आवश्यकता नहीं है। आवश्यकता का उपयोग कैसे करें, इसका एक उदाहरण यहां दिया गया है। अपनी ".rb" फ़ाइल के शीर्ष पर आवश्यकता विधि रखें:
भार
लोड विधि लगभग आवश्यकता विधि की तरह है सिवाय इसके कि वह पुस्तकालय लोड किया गया है या नहीं, इसका ट्रैक नहीं रखता है। इसलिए पुस्तकालय को कई बार लोड करना संभव है और यह भी कि लोड विधि का उपयोग करते समय आपको लाइब्रेरी फ़ाइल नाम का ".rb" एक्सटेंशन निर्दिष्ट करना होगा।
बढ़ाएँ
शामिल करने के बजाय विस्तार विधि का उपयोग करते समय, आप मॉड्यूल के तरीकों को वर्ग विधियों के रूप में जोड़ रहे हैं उदाहरण के तरीकों के बजाय।
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
'Load'- एक फ़ाइल की सामग्री सम्मिलित करता है। (हर बार फ़ाइल को कॉल किए जाने पर पार्स फ़ाइल)
'आवश्यकता'- एक फ़ाइल पार्स सामग्री सम्मिलित करता है। (फ़ाइल एक बार पार्स की गई और मेमोरी में संग्रहीत)
'शामिल करें' में मॉड्यूल को कक्षा में शामिल किया गया है और मॉड्यूल के अंदर के तरीकों को कक्षा की आवृत्ति विधि के रूप में उपयोग कर सकते हैं
'एक्सटेंड'- इसमें मॉड्यूल को क्लास में शामिल किया गया है और मॉड्यूल के अंदर के तरीकों को क्लास मेथड के रूप में इस्तेमाल कर सकते हैं
requireऔरinclude,, और भी प्रासंगिकModule#append_features।