दिलचस्प पोस्ट
ActionBarActivity पर AppCompatActivity की वृद्धि क्या है? जोड़ जावास्क्रिप्ट में काम नहीं कर रहा है JQuery का उपयोग करके विकल्प चुनने के लिए अतिरिक्त डेटा जोड़ना मैं सी # में यादृच्छिक अक्षरांकीय स्ट्रिंग कैसे उत्पन्न करूं? घातक: शुरुआती ईओएफ घातक: सूचकांक-पैक असफल रहा कैसे एक JSON फ़ाइल को प्रिंट करने के लिए? एक Genymotion आभासी डिवाइस पर Google फ़्रेमवर्क (प्ले, अकाउंट्स आदि) कैसे स्थापित करें? स्पष्ट कैश के साथ window.location.reload जावा का उपयोग करते हुए XML का तत्व मूल्य कैसे प्राप्त करें? लैंडस्केप और पोर्ट्रेट दिशा दोनों में केवल एक UIViewController को घुमाने के लिए कैसे अनुमति दें? कैसे एसिंक्रोनस LINQ क्वेरी लिखने के लिए? इसका मतलब क्या है जब वे कहते हैं कि http stateless है क्या "जीआईटी पुल" स्वचालित रूप से छिपाने और लंबित परिवर्तन पॉप कर सकता है? स्विफ्ट एक्सटेंशन में ओवरराइड करने के तरीकों मध्य क्लिक का उपयोग करते हुए ट्रिगर ऑनक्लिक ईवेंट

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

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

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

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

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

अद्यतन करें

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

वेब के समाधान से एकत्रित समाधान "रूबी: आवश्यकता होती है 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__)