दिलचस्प पोस्ट
जावा: एक सरणी में सर्वोच्च मूल्य ढूँढना टेक्स्टरिए में कर्सर स्थिति (वर्ण सूचकांक, x / y निर्देशांक नहीं) जावास्क्रिप्ट स्थानीय स्टोरेज ऑब्जेक्ट विंडोज 7 पर आईई 11 में टूट गया Linq के साथ IQueryable का उपयोग करना त्रुटि: सी स्टैक उपयोग सीमा के बहुत करीब है एंड्रॉइड में पार्स की गई छवि को कैसे क्रॉप करना है? जब मैं इस परीक्षा को चलाता हूं तो यह पाप का जासूस क्यों नहीं बुलाया जा रहा है? कुछ जावा ऑब्जेक्ट में दिनांक स्ट्रिंग पार्स करें MySQL में एपॉस्ट्रॉफी (') कैसे बचें? बास में फ़ाइल नाम और एक्सटेंशन निकालें "कन्स्ट्रक्टर" सेटिंग का लाभ "प्रोटोटाइप" में संपत्ति आवेदन नियुक्त करने के लिए iPhone का उचित उपयोग मर्ज पर व्हाइसेस्पेस को कैसे निकालें जेआरई 1.7 रिटर्न: जावा / लाँग / नोक्लसफफ़ाउंड एरर: जावा / लाँग / ऑब्जेक्ट पायथन में किसी ऑब्जेक्ट द्वारा कितनी मेमोरी का उपयोग किया जा रहा है, पता करें

रूबी: आवश्यकता होती है vs_relative – रूबी <1.9.2 और> = 1.9.2 दोनों में चलने के लिए सबसे अच्छा अभ्यास

रूबी में एक सापेक्ष फ़ाइल की require तो मैं सबसे अच्छा अभ्यास क्या है और मैं इसे 1.8.x और> = 1.9.2 दोनों में काम करना चाहता हूं?

मुझे कुछ विकल्प दिखाई देते हैं:

  • बस $LOAD_PATH << '.' और सबकुछ भूल जाओ
  • करो $LOAD_PATH << File.dirname(__FILE__)
  • require './path/to/file'
  • RUBY_VERSION <1.9.2 की जांच करें, इसके बाद require को परिभाषित करें, हर जगह require_relative उपयोग करें जहां इसे बाद में आवश्यक है
  • जाँच करें कि यदि आवश्यक require_relative पहले से मौजूद है, यदि ऐसा होता है, तो पिछले मामले में आगे बढ़ने का प्रयास करें
  • ऐसे अजीब निर्माण का उपयोग करें जैसे कि
     require File.join(File.dirname(__FILE__), 'path/to/file') 

    – अफसोस है कि वे रूबी 1.9 से बिल्कुल काम नहीं करते हैं, क्योंकि, उदाहरण के लिए:

     $ cat caller.rb require File.join(File.dirname(__FILE__), 'path/to/file') $ cat path/to/file.rb puts 'Some testing' $ ruby caller Some testing $ pwd /tmp $ ruby /tmp/caller Some testing $ ruby tmp/caller tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError) from tmp/caller.rb:1:in '<main>' 
  • यहां तक ​​कि weirder निर्माण:
     require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file') 

    काम करने लगता है, लेकिन यह अजीब है और काफी अच्छा नहीं लग रही है।

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

स्टैक ओवरफ्लो पर एक निकटता से संबंधित प्रश्न है जो कुछ और उदाहरण देता है, लेकिन यह स्पष्ट उत्तर नहीं देता – जो एक सर्वोत्तम अभ्यास है

क्या रूबी <1.9.2 और> = 1.9.2 दोनों पर मेरे आवेदन को चलाने के लिए कोई भी सभ्य, स्वीकार्य-दर-हर-सा सार्वभौमिक समाधान है?

अद्यतन करें

स्पष्टीकरण: मुझे सिर्फ जवाब नहीं चाहिए "आप एक्स कर सकते हैं" – वास्तव में, मैंने पहले से ही सवाल में अधिकांश विकल्पों का उल्लेख किया है। मैं तर्क चाहता हूँ, अर्थात् क्यों यह एक सर्वोत्तम अभ्यास है, इसके पेशेवर और विपक्ष क्या हैं और दूसरों के बीच में क्यों चुना जाना चाहिए

Solutions Collecting From Web of "रूबी: आवश्यकता होती है vs_relative – रूबी <1.9.2 और> = 1.9.2 दोनों में चलने के लिए सबसे अच्छा अभ्यास"

इसके लिए एक वैकल्पिक हल सिर्फ 'एएएस' मणि में जोड़ा गया था, इसलिए मैंने सोचा था कि इस पोस्ट से प्रेरित होने के कारण इसे साझा किया जाएगा।

https://github.com/appoxy/aws/blob/master/lib/awsbase/require_relative.rb

 unless Kernel.respond_to?(:require_relative) module Kernel def require_relative(path) require File.join(File.dirname(caller[0]), path.to_str) end end end 

यह आपको require_relative उपयोग करने की अनुमति देता है क्योंकि आप रब्बी 1.8.2 में 1.9.2 रूबी और 1.9.1

इससे पहले कि मैंने 1.9.2 के लिए कूद दिया, मैंने रिश्तेदार के लिए निम्नलिखित का इस्तेमाल किया:

 require File.expand_path('../relative/path', __FILE__) 

पहली बार जब आप इसे देखते हैं तो यह थोड़ा अजीब है, क्योंकि ऐसा लगता है कि शुरुआत में एक अतिरिक्त '..' है कारण यह है कि expand_path द्वितीय तर्क के सापेक्ष पथ का विस्तार करेगा, और दूसरी तर्क व्याख्या की जाएगी जैसे कि यह एक निर्देशिका थी __FILE__ जाहिर एक निर्देशिका नहीं है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि expand_path ध्यान नहीं देता कि क्या फाइलें मौजूद हैं या नहीं, यह सिर्फ कुछ नियमों को लागू करने के लिए जैसे .. , जैसे विस्तार करने के लिए . और ~ यदि आप शुरुआती "प्रतीक्षामैनट" प्राप्त कर सकते हैं तो वहां अतिरिक्त नहीं है .. वहां? मुझे लगता है कि ऊपर की पंक्ति बहुत अच्छी तरह से काम करती है

यह मानते हुए कि __FILE__ /absolute/path/to/file.rb , क्या होता है कि expand_path स्ट्रिंग का निर्माण करेगा, और उसके बाद एक नियम लागू होगा जो कहता है कि .. इससे पहले पथ घटक को निकालना चाहिए (इस मामले में file.rb ), वापस /absolute/path/to/relative/path

यह सबसे अच्छा अभ्यास है? आपके द्वारा इसका क्या मतलब है पर निर्भर करता है, लेकिन ऐसा लगता है कि यह रेल कोड आधार पर है, इसलिए मैं कह सकता हूं कि यह कम से कम एक सामान्य मुहावर है

पिकैक्स में 1.8 के लिए एक स्निपेट है। यह रहा:

 def require_relative(relative_feature) c = caller.first fail "Can't parse #{c}" unless c.rindex(/:\d+(:in `.*')?$/) file = $` if /\A\((.*)\)/ =~ file # eval, etc. raise LoadError, "require_relative is called in #{$1}" end absolute = File.expand_path(relative_feature, File.dirname(file)) require absolute end 

यह मूलतः थियो ने क्या जवाब दिया, लेकिन इसका उपयोग आप अभी भी require_relative उपयोग कर सकते हैं।

 $LOAD_PATH << '.' $LOAD_PATH << File.dirname(__FILE__) 

यह एक अच्छी सुरक्षा आदत नहीं है: आपको अपनी पूरी निर्देशिका को क्यों उजागर करना चाहिए?

 require './path/to/file' 

यह काम नहीं करता यदि RUBY_VERSION <1.9.2

ऐसे अजीब निर्माण का उपयोग करें जैसे कि

 require File.join(File.dirname(__FILE__), 'path/to/file') 

यहां तक ​​कि weirder निर्माण:

 require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file') 

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

आपने पहले से यही जवाब दिया है कि ये सबसे अच्छा विकल्प क्यों नहीं हैं

RUBY_VERSION <1.9.2 की जांच करें, इसके बाद अपेक्षित_संबंधित को परिभाषित करें, हर जगह require_relative का उपयोग करें जहां इसे बाद में आवश्यक है

जाँच करें कि यदि आवश्यक है_संबंधित पहले से मौजूद है, यदि ऐसा होता है, तो पिछले मामले में आगे बढ़ने का प्रयास करें

यह काम कर सकता है, लेकिन सुरक्षित और तेज़ तरीका है: LoadError अपवाद से निपटने के लिए:

 begin # require statements for 1.9.2 and above, such as: require "./path/to/file" # or require_local "path/to/file" rescue LoadError # require statements other versions: require "path/to/file" end 

मैं आरबीएक्स-आवश्यक-रिश्तेदार मणि ( स्रोत ) का उपयोग करने का एक प्रशंसक हूं यह मूल रूप से रूबिनीस के लिए लिखा गया था, लेकिन यह एमआरआई 1.8.7 का समर्थन करता है और 1.9.2 में कुछ भी नहीं करता है। एक मणि की आवश्यकता सरल है, और मुझे अपनी परियोजना में कोड स्निपेट फेंकना नहीं पड़ता है

इसे अपने Gemfile में जोड़ें:

 gem "rbx-require-relative" 

इसके बाद require 'require_relative' होने के पहले require 'require_relative'

उदाहरण के लिए, मेरी एक परीक्षण फाइल इस तरह दिखती है:

 require 'rubygems' require 'bundler/setup' require 'minitest/autorun' require 'require_relative' require_relative '../lib/foo' 

यह इनमें से किसी भी आईएमओ से साफ समाधान है, और मणि बैकपोर्टों जितना भारी नहीं है।

backports मणि अब backports व्यक्तिगत लोडिंग की अनुमति देता है।

आप तो बस कर सकते हैं:

 require 'backports/1.9.1/kernel/require_relative' # => Now require_relative works for all versions of Ruby 

यह require कि नए संस्करणों को प्रभावित नहीं किया जाएगा, न ही यह किसी अन्य बिल्टिन विधियों को अपडेट करेगा।

दूसरे विकल्प का उपयोग दुभाषिया को बताता है कि कौन सा पथ खोजना है

 ruby -I /path/to/my/project caller.rb 

एक मुद्दा मैंने देखा नहीं है __FILE__ पर आधारित समाधान के साथ बताया है कि वे सिम्प्लेक्स के संबंध में तोड़ते हैं उदाहरण के लिए कहें कि मेरे पास है:

 ~/Projects/MyProject/foo.rb ~/Projects/MyProject/lib/someinclude.rb 

मुख्य स्क्रिप्ट, प्रवेश बिंदु, आवेदन foo.rb है। यह फाइल ~ / स्क्रिप्ट / फ़ू से जुड़ी हुई है जो कि मेरे $ पायथ में है इसके लिए वक्त की आवश्यकता होती है जब मैं 'फू' निष्पादित करता हूं:

 require File.join(File.dirname(__FILE__), "lib/someinclude") 

क्योंकि __FILE__ ~ ~ / लिपियों / फू है, इसलिए उपर्युक्त बयान ~ / स्क्रिप्ट / फू / लिब / कुछ शामिल। आरबी के लिए दिखता है जो स्पष्ट रूप से अस्तित्व में नहीं है। समाधान सरल है यदि __FILE__ एक प्रतीकात्मक लिंक है, तो इसे dereferenced होना चाहिए। पथनाम # असलीपथ इस स्थिति में हमारी सहायता करेगा:

 "पथनाम" की आवश्यकता है
 फ़ाइल फ़ाइल की आवश्यकता है। (फ़ाइल। डाइनाम (पाथनाम। नया (__ फ़ाइल __)। वास्तविकपथ), "लिब / कुछ शामिल")

यदि आप एक मणि का निर्माण कर रहे थे, तो आप लोड पथ को प्रदूषित नहीं करना चाहते थे।

लेकिन, एक स्टैंडअलोन आवेदन के मामले में बस मौजूदा निर्देशिका को लोड पथ में जोड़ना बहुत आसान है जैसा कि आप पहले 2 उदाहरणों में करते हैं।

मेरा वोट सूची पर पहला विकल्प है।

मुझे रूबी के कुछ ठोस प्रथाओं साहित्य को देखने के लिए अच्छा लगेगा

मैं अपनी खुद की relative_require परिभाषा को परिभाषित करता हूं अगर वह मौजूद नहीं है (यानी 1.8 के अंतर्गत) और फिर हर जगह एक ही वाक्यविन्यास का उपयोग करें

रेल मार्ग पर रूबी:

 config_path = File.expand_path("../config.yml", __FILE__)