require_relative
और require
रूबी में क्या अंतर है ?
require_relative
और require
रूबी में क्या अंतर है ?
जवाबों:
बस डॉक्स को देखें :
require_relative
require
आप एक फ़ाइल को लोड करने की अनुमति देकर बिलिन विधि का अनुपालन करते हैं जो किrequire_relative
कथन वाली फ़ाइल के सापेक्ष है ।उदाहरण के लिए, यदि आपके पास "परीक्षण" निर्देशिका में इकाई परीक्षण कक्षाएं हैं, और परीक्षण "परीक्षण / डेटा" निर्देशिका के तहत उनके लिए डेटा है, तो आप एक परीक्षण मामले में इस तरह की रेखा का उपयोग कर सकते हैं:
require_relative "data/customer_data_1"
require './file.rb'
और कोई फर्क है require_relative 'file.rb'
?
require_relative
आपको "एक फ़ाइल लोड करने की अनुमति देता है जो कि कथन वाली फ़ाइल के सापेक्ष हैrequire_relative
"। के साथ require
, ./
एक पथ इंगित करता है जो आपकी वर्तमान कार्यशील निर्देशिका के सापेक्ष है।
require str
हमेशा $ LOAD_PATH में निर्देशिकाओं के माध्यम से खोज करेंगे। require_relative
जब आपको लोड करने की आवश्यकता होती है, तो आपको उस फ़ाइल के सापेक्ष कहीं मौजूद होना चाहिए जो लोडिंग के लिए कॉल करता है। require
"बाहरी" निर्भरता के लिए आरक्षित ।
require_relative
का एक सुविधाजनक सबसेट है require
require_relative('path')
बराबर है:
require(File.expand_path('path', File.dirname(__FILE__)))
अगर __FILE__
परिभाषित किया गया है, या यह LoadError
अन्यथा उठता है।
यह बताता है कि:
require_relative 'a'
और वर्तमान फ़ाइल केrequire_relative './a'
सापेक्ष आवश्यक है ( )।__FILE__
यह वही है जो आप अपने पुस्तकालय के अंदर आवश्यकता होने पर उपयोग करना चाहते हैं, क्योंकि आप नहीं चाहते कि परिणाम कॉलर की वर्तमान निर्देशिका पर निर्भर हो।
eval('require_relative("a.rb")')
उठाता है LoadError
क्योंकि __FILE__
अंदर परिभाषित नहीं है eval
।
यही कारण है कि आप require_relative
RSpec परीक्षणों में उपयोग नहीं कर सकते हैं , जो eval
एड प्राप्त करते हैं ।
निम्नलिखित ऑपरेशन केवल इसके साथ ही संभव हैं require
:
require './a.rb'
वर्तमान निर्देशिका के सापेक्ष आवश्यकता होती है
require 'a.rb'
$LOAD_PATH
आवश्यकता के लिए खोज पथ ( ) का उपयोग करता है। यह वर्तमान निर्देशिका या पथ के सापेक्ष फाइलें नहीं खोजता है।
यह संभव नहीं है require_relative
क्योंकि दस्तावेज़ का कहना है कि मार्ग खोज ही होता है जब "फ़ाइल नाम एक निरपेक्ष पथ के लिए हल नहीं होती है" (के साथ शुरू होता है यानी /
या ./
या ../
) है, जो हमेशा के लिए मामला है File.expand_path
।
निम्नलिखित ऑपरेशन दोनों के साथ संभव है, लेकिन आप require
इसे कम और अधिक कुशल बनाने के लिए उपयोग करना चाहेंगे :
require '/a.rb'
और require_relative '/a.rb'
दोनों को परम मार्ग की आवश्यकता है।स्रोत को पढ़ना
जब डॉक्स स्पष्ट नहीं होते हैं, तो मैं सुझाव देता हूं कि आप स्रोतों (डॉक्स में स्रोत को टॉगल करें) पर एक नज़र डालें। कुछ मामलों में, यह समझने में मदद करता है कि क्या चल रहा है।
आवश्यकता होती है:
VALUE rb_f_require(VALUE obj, VALUE fname) {
return rb_require_safe(fname, rb_safe_level());
}
require_relative:
VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
VALUE base = rb_current_realfilepath();
if (NIL_P(base)) {
rb_loaderror("cannot infer basepath");
}
base = rb_file_dirname(base);
return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}
यह हमें यह निष्कर्ष निकालने की अनुमति देता है
require_relative('path')
के समान है:
require(File.expand_path('path', File.dirname(__FILE__)))
चूंकि:
rb_file_absolute_path =~ File.expand_path
rb_file_dirname1 =~ File.dirname
rb_current_realfilepath =~ __FILE__
रूबी एपीआई से :
requirement_relative कंप्लेंट्स में buildin मेथड की आवश्यकता होती है जो आपको एक फाइल लोड करने की अनुमति देता है जो कि आवश्यकता के अनुरूप फाइल के सापेक्ष होती है।
जब आप किसी फ़ाइल को लोड करने की आवश्यकता का उपयोग करते हैं, तो आप आमतौर पर कार्यक्षमता को एक्सेस कर रहे होते हैं जो आपके सिस्टम में ठीक से स्थापित किया गया है, और सुलभ बनाया गया है। आवश्यकता परियोजना के कोड के भीतर फ़ाइलों को लोड करने के लिए एक अच्छा समाधान प्रदान नहीं करता है। यह एक विकास चरण के दौरान उपयोगी हो सकता है, परीक्षण डेटा तक पहुंचने के लिए, या यहां तक कि उन फ़ाइलों तक पहुंचने के लिए जो किसी प्रोजेक्ट के अंदर "लॉक" हैं, न कि बाहरी उपयोग के लिए।
उदाहरण के लिए, यदि आपके पास "परीक्षण" निर्देशिका में इकाई परीक्षण कक्षाएं हैं, और परीक्षण "परीक्षण / डेटा" निर्देशिका के तहत उनके लिए डेटा है, तो आप एक परीक्षण मामले में इस तरह की रेखा का उपयोग कर सकते हैं:
require_relative "data/customer_data_1"
चूंकि न तो "परीक्षण" और न ही "परीक्षण / डेटा" रूबी के पुस्तकालय पथ (और अच्छे कारण के लिए) में होने की संभावना है, एक सामान्य आवश्यकता उन्हें नहीं मिलेगी। requirement_relative इस विशेष समस्या के लिए एक अच्छा समाधान है।
आप अपने द्वारा लोड की जा रही फ़ाइल के एक्सटेंशन (.rb या .so) को शामिल या छोड़ सकते हैं।
पथ को to_str का जवाब देना चाहिए।
आप http://extensions.rubyforge.org/rdoc/classes/Kernel.html पर प्रलेखन पा सकते हैं
require
स्थापित रत्नों के लिए उपयोग करेंrequire_relative
स्थानीय फ़ाइलों के लिए उपयोग करेंrequire
$LOAD_PATH
फ़ाइलों को खोजने के लिए अपने का उपयोग करता है ।
require_relative
स्टेटमेंट का उपयोग करके फ़ाइल के वर्तमान स्थान का उपयोग करता है
gem install [package]
उस कार्यक्षमता के लिए आपके सिस्टम पर कहीं एक पैकेज स्थापित होने (जैसे ) पर निर्भर होने की आवश्यकता होती है।
जब require
आप वर्तमान निर्देशिका में फ़ाइल के लिए " " प्रारूप का उपयोग कर सकते हैं ./
, उदाहरण के लिए, require "./my_file"
लेकिन यह एक सामान्य या अनुशंसित अभ्यास नहीं है और आपको require_relative
इसके बजाय उपयोग करना चाहिए ।
इसका सीधा सा मतलब है कि फ़ाइल 'फ़ाइल के स्थान के सापेक्ष' के साथ जरूरी_ विवरणात्मक विवरण शामिल है। मैं आमतौर पर सुझाव देता हूं कि फाइलों को "निर्देशिका" के भीतर "अप" के विपरीत "अप" होना चाहिए, उदाहरण के लिए उपयोग न करें
require_relative '../../../filename'
(3 डायरेक्टरी लेवल तक) फाइल सिस्टम के भीतर क्योंकि यह अनावश्यक और भंगुर निर्भरता पैदा करता है। हालाँकि कुछ मामलों में यदि आप पहले से ही एक डायरेक्टरी ट्री के भीतर 'डीप' हैं तो एक और डायरेक्टरी ट्री ब्रांच "अप एंड डाउन" आवश्यक हो सकती है। अधिक सरल रूप से, इस रिपॉजिटरी के बाहर की फाइलों के लिए requ_relative का उपयोग न करें (यह मानते हुए कि आप git का उपयोग कर रहे हैं जो इस बिंदु पर काफी हद तक एक वास्तविक मानक है, 2018 के अंत में)।
ध्यान दें कि आवश्यकता के साथ फ़ाइलrequire_relative
की वर्तमान निर्देशिका का उपयोग करना आवश्यक है (इसलिए जरूरी नहीं कि आपकी वर्तमान निर्देशिका जो आप कमांड का उपयोग कर रहे हैं)। यह require_relative
पथ को "स्थिर" रखता है क्योंकि यह हमेशा उसी तरह से आवश्यक फ़ाइल के सापेक्ष होता है।
शीर्ष उत्तर सही हैं, लेकिन गहराई से तकनीकी हैं। रूबी के लिए नए लोगों के लिए:
require_relative
आपके द्वारा लिखी गई किसी अन्य फ़ाइल से कोड लाने के लिए सबसे अधिक संभावना होगी। उदाहरण के लिए, यदि आपके पास डेटा है ~/my-project/data.rb
और आप उसे इसमें शामिल करना चाहते हैं ~/my-project/solution.rb
? में solution.rb
आप जोड़ना होगा require_relative 'data'
।
यह नोट करना महत्वपूर्ण है कि इन फ़ाइलों को एक ही निर्देशिका में होने की आवश्यकता नहीं है। require_relative '../../folder1/folder2/data'
भी मान्य है।
require
किसी पुस्तकालय में किसी अन्य व्यक्ति द्वारा लिखे गए कोड को लाने के लिए सबसे अधिक संभावना होगी।उदाहरण के लिए, यदि आप active_support
पुस्तकालय में दिए गए सहायक कार्यों में से किसी एक का उपयोग करना चाहते हैं, तो क्या होगा ? आपको मणि को gem install activesupport
फिर फ़ाइल में स्थापित करना होगा require 'active_support'
।
require 'active_support/all'
"FooBar".underscore
अलग तरह से कहा--
require_relative
विशेष रूप से कॉल करने वाली फ़ाइल के सापेक्ष इंगित की गई फ़ाइल की आवश्यकता होती है।
require
में शामिल एक फ़ाइल की आवश्यकता है $LOAD_PATH
।
मैंने अभी देखा कि RSpec के कोड में require_relative
O (1) स्थिर और require
O (N) रैखिक होने पर कुछ टिप्पणी है । तो शायद अंतर यह है कि require_relative
पसंदीदा की तुलना में अधिक है require
।
require_relative
तेज़ थी क्योंकि लोडर को फ़ाइल की तलाश में लोड पथ को पार नहीं करना पड़ता है। अनिवार्य रूप से, require_relative
एक सीधा लिंक प्रदान करता है।
मैं यह जोड़ना चाहता हूं कि विंडोज का उपयोग करते समय आप उपयोग कर सकते हैं require './1.rb'
यदि स्क्रिप्ट स्थानीय या एक मैप्ड नेटवर्क ड्राइव से चलती है, लेकिन जब यूएनसी \\servername\sharename\folder
पथ से चलाया जाता है तो आपको उपयोग करने की आवश्यकता होती है require_relative './1.rb'
।
मैं अन्य कारणों से चर्चा में नहीं आता।
require_relative
फ़ाइल आप कृपया इस पर एक विचार फेंक कर सके stackoverflow.com/questions/43487784/...
$:
। देखें stackoverflow.com/questions/2900370