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




include require (7)

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

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


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

उत्तर:

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

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

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

Source

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

विचित्र रूप से पर्याप्त, रूबी की require सी के समान है, जबकि रूबी के include हैं सी के include कुछ भी नहीं है।


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

MyModule = Module.new
require MyModule # see what happens

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


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

आवश्यक है:

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

शामिल:

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

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

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


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

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


शामिल

जब आप अपनी कक्षा include एक मॉड्यूल 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

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

  • रूबी include मिक्स्डिन के लिए उपयोग की जाने वाली ऑब्जेक्ट उन्मुख विरासत तंत्र include है।

यहां एक अच्छी व्याख्या here :

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

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

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

महत्व दिया।





require