रूबी में शामिल और आवश्यकता के बीच क्या अंतर है?


465

मेरा प्रश्न " रूबी में शामिल और विस्तारित करने के बीच अंतर क्या है? " के समान है।

requireऔर includeरूबी में क्या अंतर है ? अगर मैं सिर्फ अपनी कक्षा में एक मॉड्यूल से विधियों का उपयोग करना चाहता हूं, तो मुझे requireयह करना चाहिए या includeयह?


1
क्या यह की कीमत के लिए, यहाँ के लिए समुदाय प्रलेखन के लिंक हैं requireऔर include,, और भी प्रासंगिक Module#append_features

जवाबों:


543

रूबी में "शामिल" और "आवश्यकता" के बीच क्या अंतर है?

उत्तर:

शामिल हैं और तरीकों की आवश्यकता बहुत अलग चीजें हैं।

आवश्यकता विधि वह करती है जो अधिकांश अन्य प्रोग्रामिंग भाषाओं में शामिल होती है: एक और फ़ाइल चलाएं। यह ट्रैक करता है कि आपने अतीत में क्या आवश्यक है और दो बार एक ही फ़ाइल की आवश्यकता नहीं होगी। इस अतिरिक्त कार्यक्षमता के बिना किसी अन्य फ़ाइल को चलाने के लिए, आप लोड विधि का उपयोग कर सकते हैं।

शामिल विधि अन्य मॉड्यूल से सभी तरीकों को लेती है और उन्हें वर्तमान मॉड्यूल में शामिल करती है। यह एक भाषा-स्तर की चीज़ है जो आवश्यकता के अनुसार फ़ाइल-स्तरीय चीज़ के विपरीत है। शामिल विधि अन्य मॉड्यूल (आमतौर पर मिक्स-इन के रूप में संदर्भित) के साथ वर्गों का "विस्तार" करने का प्राथमिक तरीका है। उदाहरण के लिए, यदि आपकी कक्षा "प्रत्येक" विधि को परिभाषित करती है, तो आप मिक्सिन मॉड्यूल को शामिल कर सकते हैं और यह संग्रह के रूप में कार्य कर सकता है। यह भ्रामक हो सकता है क्योंकि शामिल क्रिया अन्य भाषाओं में बहुत अलग तरीके से उपयोग की जाती है।

स्रोत

इसलिए यदि आप केवल एक मॉड्यूल का उपयोग करना चाहते हैं, बजाय इसे बढ़ाने या मिक्स-इन करने के, तो आप उपयोग करना चाहेंगे require

अजीब तरह से, रूबी requireसी के अनुरूप है include, जबकि रूबी includeसी की तरह लगभग कुछ भी नहीं है include


45
वास्तव में C में शामिल है, फ़ाइल को आवश्यकता के अनुसार लोड नहीं करता है, बल्कि फ़ाइल की सामग्री द्वारा #include लाइन को प्रतिस्थापित करता है। शामिल फ़ाइलों में 'हेडर' नहीं होना चाहिए और #include को फाइल की शुरुआत में नहीं होना चाहिए, लेकिन कहीं भी हो सकता है, जैसे कक्षा में या यहां तक ​​कि एक विधि परिभाषा। इसका मतलब है कि आप सी + + में मिक्सिन कुछ तरीकों से फाइल में लिखकर कर सकते हैं और इसे एक क्लास के कोड में शामिल कर सकते हैं, ठीक उसी तरह जैसे आप माणिक में करते हैं। इसलिए वे इतने दूर नहीं हैं, भले ही यह वास्तव में सी में एक सामान्य अभ्यास नहीं है।
mb14

13
यह उत्तर उदाहरण सहित लाभान्वित कर सकता है।
ट्रैविस बियर

12
mb14 की टिप्पणी से इसका तात्पर्य है, लेकिन यह स्पष्ट रूप से बताते हुए कहा गया है: उत्तर के अनुसार, किसी फ़ाइल को "रन" करने की आवश्यकता नहीं होती है , बल्कि इसे लोड करने के रूप में यद्यपि यह युक्त फ़ाइल का हिस्सा था। यह सिमेंटिक नाइटपैकिंग की तरह लग सकता है लेकिन वास्तव में यह एक महत्वपूर्ण अंतर है।
लोनी Everyus

महान व्याख्या। पिछले बयान के साथ बिंदु घर चलाने के लिए धन्यवाद 'अजीब तरह से पर्याप्त है, रूबी की आवश्यकता सी के शामिल करने के लिए अनुरूप है, जबकि रूबी के शामिल सी की तरह लगभग कुछ भी नहीं है।'
ArtSabintsev

1
@GregSchmit: includeरूबी में सिर्फ विरासत है। (और) (पूर्व) के सुपरक्लास के सुपरक्लास class C; include M endबनाता है । मुझे नहीं लगता कि सी की विरासत के माध्यम से काम करता है, मुझे लगता है कि यह सरल शाब्दिक / शाब्दिक प्रतिस्थापन है। MCCMinclude
जोर्ज डब्ल्यू मित्तग

100

यदि आप एक मॉड्यूल का उपयोग कर रहे हैं, तो इसका मतलब है कि आप सभी तरीकों को अपनी कक्षा में ला रहे हैं। यदि आप 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 => सी: क्लास के लिए अपरिभाषित विधि 'कहना'


23
मुझे लगता है कि यह सवाल का जवाब नहीं देता है, लेकिन यह वही है जो मैं देख रहा था =)
सिरो सेंटिल्ली 郝海东 answer answer answer 法轮功

2
यह वास्तव में क्या के बीच मतभेद की सवाल का जवाब नहीं है requireऔर includeकर रहे हैं।

94

मेटाप्रोग्रामिंग रूबी पुस्तक से,

require()विधि काफी के समान है load(), लेकिन यह एक अलग उद्देश्य के लिए है। आप load()कोड निष्पादित करने के लिए उपयोग करते हैं , और आप require()पुस्तकालयों को आयात करने के लिए उपयोग करते हैं।


73
अपने उत्तर में किसी अन्य भाषा की तुलना न करने के लिए अपवोट करें :)
स्टीवो

प्रश्न के संदर्भ में जवाब न देने के लिए डाउन वोट: "अगर मैं सिर्फ अपनी कक्षा में एक मॉड्यूल से विधियों का उपयोग करना चाहता हूं?"
benc

57
  • रूबी requireअन्य भाषाओं (जैसे सी) में "शामिल" की तरह अधिक है। यह रूबी को बताता है कि आप किसी अन्य फ़ाइल की सामग्री में लाना चाहते हैं । अन्य भाषाओं में समान तंत्र हैं:

  • रूबी includeएक ऑब्जेक्ट-ओरिएंटेड इनहेरिटेंस मैकेनिज़्म है जिसका उपयोग मिक्सिन्स के लिए किया जाता है

यहाँ एक अच्छी व्याख्या है :

[] सरल उत्तर यह है कि आवश्यकता और शामिल अनिवार्य रूप से असंबंधित हैं।

"आवश्यकता" सी के समान है, जिसमें नौसिखिया भ्रम हो सकता है। (एक उल्लेखनीय अंतर यह है कि आवश्यकता होने पर आवश्यक फ़ाइल "लुप्त हो जाना" के अंदर स्थानीय लोग।)

रूबी शामिल सी की तरह कुछ भी शामिल नहीं है। एक वर्ग में एक मॉड्यूल में बयान "मिक्स इन" शामिल है। यह कई उत्तराधिकार का एक सीमित रूप है । एक शामिल मॉड्यूल शाब्दिक रूप से "ए-ए" रिश्ते को शामिल करता है, जिसमें यह शामिल है।

महत्व दिया।


7

क्या आपने कभी requireकिसी मॉड्यूल की कोशिश की है ? परिणाम क्या थे? कोशिश करो:

MyModule = Module.new
require MyModule # see what happens

मॉड्यूल की आवश्यकता नहीं हो सकती, केवल शामिल!


यहां का दावा सही नहीं है। मॉड्यूल की आवश्यकता हो सकती है। और उपरोक्त कोड को चलाने वाला कोई भी व्यक्ति यह पाएगा कि TypeErrorयदि शब्द Moduleबदल गया है तो उन्हें वही परिणाम ( ) प्राप्त होगा Class
१५

7

से प्रोग्रामिंग रूबी 1.9

हम जाने से पहले शामिल बयान के बारे में कुछ बिंदु देंगे। पहला, इसका फाइलों से कोई लेना-देना नहीं है। सी प्रोग्रामर संकलन के दौरान एक फ़ाइल की सामग्री को दूसरे में डालने के लिए #include नामक एक पूर्वप्रक्रमक निर्देश का उपयोग करते हैं। रूबी में केवल एक मॉड्यूल का संदर्भ दिया गया विवरण शामिल है। यदि वह मॉड्यूल एक अलग फ़ाइल में है, तो आपको शामिल करने से पहले उस फ़ाइल को खींचने के लिए आवश्यकता (या इसके कम इस्तेमाल होने वाले चचेरे भाई, लोड) का उपयोग करना होगा। दूसरा, एक रूबी में केवल मॉड्यूल की आवृत्ति विधियों को कक्षा में कॉपी करना शामिल नहीं है। इसके बजाय, यह वर्ग से शामिल मॉड्यूल के लिए एक संदर्भ बनाता है। यदि कई वर्गों में उस मॉड्यूल को शामिल किया जाता है, तो वे सभी एक ही चीज़ की ओर इशारा करेंगे। यदि आप एक मॉड्यूल के भीतर एक विधि की परिभाषा बदलते हैं, भले ही आपका कार्यक्रम चल रहा हो,


3

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

लोड लोड विधि लगभग आवश्यकता विधि की तरह है सिवाय इसके कि वह पुस्तकालय लोड किया गया है या नहीं, इसका ट्रैक नहीं रखता है। इसलिए पुस्तकालय को कई बार लोड करना संभव है और यह भी कि लोड विधि का उपयोग करते समय आपको लाइब्रेरी फ़ाइल नाम का ".rb" एक्सटेंशन निर्दिष्ट करना होगा।

आवश्यकता आवश्यकता विधि आपको लाइब्रेरी लोड करने की अनुमति देती है और इसे एक से अधिक बार लोड होने से रोकती है। यदि आप पहली बार के बाद उसी लाइब्रेरी को लोड करने का प्रयास करते हैं, तो आवश्यकता विधि 'झूठी' वापस आ जाएगी। आवश्यकता विधि का केवल उपयोग करने की आवश्यकता है यदि आपके द्वारा लोड की जा रही लाइब्रेरी को एक अलग फ़ाइल में परिभाषित किया गया है, जो आमतौर पर मामला है।

आप इसे http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/ पसंद कर सकते हैं


3

नीचे कुछ बुनियादी अंतर आवश्यक और शामिल हैं:

आवश्यक है:

  1. फ़ाइल सिस्टम से फ़ाइल को पढ़ने की आवश्यकता होती है, इसे पार्स करता है, मेमोरी को बचाता है और इसे दिए गए स्थान पर चलाता है जिसका अर्थ है कि यदि आप कुछ भी बदलेंगे, जबकि स्क्रिप्ट चल रही है तो यह प्रतिबिंबित नहीं होगा।
  2. हमें नाम से फ़ाइल की आवश्यकता है, मॉड्यूल नाम से नहीं।
  3. यह आमतौर पर पुस्तकालयों और एक्सटेंशन के लिए उपयोग किया जाता है।

शामिल:

  1. जब आप अपनी कक्षा में एक मॉड्यूल शामिल करते हैं तो यह ऐसा व्यवहार करता है जैसे कि आपने अपने मॉड्यूल में परिभाषित कोड लिया और उसे अपनी कक्षा में डाला।
  2. हम मॉड्यूल का नाम शामिल करते हैं, न कि फ़ाइल नाम का।
  3. यह आमतौर पर कोड को सूखने और कोड में दोहराव को हटाने के लिए उपयोग किया जाता है।

2
require(name)

यह बोलियन को सही / गलत लौटाएगा

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

include module_name

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


2

शामिल

जब आप 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

2

'Load'- एक फ़ाइल की सामग्री सम्मिलित करता है। (हर बार फ़ाइल को कॉल किए जाने पर पार्स फ़ाइल)

'आवश्यकता'- एक फ़ाइल पार्स सामग्री सम्मिलित करता है। (फ़ाइल एक बार पार्स की गई और मेमोरी में संग्रहीत)

'शामिल करें' में मॉड्यूल को कक्षा में शामिल किया गया है और मॉड्यूल के अंदर के तरीकों को कक्षा की आवृत्ति विधि के रूप में उपयोग कर सकते हैं

'एक्सटेंड'- इसमें मॉड्यूल को क्लास में शामिल किया गया है और मॉड्यूल के अंदर के तरीकों को क्लास मेथड के रूप में इस्तेमाल कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.