रूबी में __FILE__ का क्या अर्थ है?


216

मैं यह सब रूबी में देख रहा हूं:

require File.dirname(__FILE__) + "/../../config/environment"  

क्या __FILE__मतलब है?


संदर्भों को एक साथ जोड़ने में मदद करने के लिए, रूबी-forum.com/topic/143383 और stackoverflow.com/questions/4325759/…
टिन मैन

जवाबों:


144

यह वर्तमान फ़ाइल नाम का संदर्भ है। फ़ाइल में foo.rb, के __FILE__रूप में व्याख्या की जाएगी "foo.rb"

संपादित करें: रूबी 1.9.2 और 1.9.3 अपनी टिप्पणी में ल्यूक बेयस द्वारा कही गई बात से थोड़ा अलग व्यवहार करते दिखाई देते हैं । इन फ़ाइलों के साथ:

# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__

रनिंग ruby test.rbआउटपुट देगा

test.rb
/full/path/to/dir2/test.rb

87
यह उत्तर सटीक नहीं है। फ़ाइल मौजूदा निष्पादन निर्देशिका से फ़ाइल के लिए "सापेक्ष" पथ है - निरपेक्ष नहीं। पूर्ण पथ प्राप्त करने के लिए आपको File.expand_path ( FILE ) का उपयोग करना होगा
ल्यूक बेयस

7
उपरोक्त टिप्पणी के भीतर डबल अंडरस्कोर स्वचालित रूप से हटा दिए गए थे।
ल्यूक बेयस

1
क्या यह अब भी रूबी में सच है 1.9.2?
ज़सज

4
@Zasz यह 1.9.2 में थोड़े अलग काम करता है। प्रारंभ में भरी गई फ़ाइल में एक रिश्तेदार __FILE__ है, लेकिन अन्य शामिल / आवश्यक फ़ाइलों में पूर्ण पथ हैं।
ज्योफ

9
@LukeBayes आप बैकस्टिक्स के साथ शाब्दिक पाठ के आसपास स्टैक ओवरफ्लो टिप्पणियों में अंडरस्कोर और अन्य विशेष पात्रों को संरक्षित कर सकते हैं। `__FILE__`पाने के लिए लिखो __FILE__
रॉरी ओ'केन

62

__FILE__जब आपकी फ़ाइल लोड की जाती है तो संग्रहीत और संग्रहीत (लेकिन कभी अद्यतन नहीं) एक सापेक्ष पथ का मान है। इसका मतलब यह है कि यदि Dir.chdirआपके आवेदन में कहीं और कॉल है , तो यह पथ गलत तरीके से विस्तारित होगा।

puts __FILE__
Dir.chdir '../../'
puts __FILE__

इस समस्या का एक समाधान __FILE__किसी भी एप्लिकेशन कोड के बाहर के विस्तारित मूल्य को संग्रहीत करना है । जब तक आपके requireकथन आपकी परिभाषाओं के शीर्ष पर हैं (या कम से कम किसी भी कॉल से पहले Dir.chdir), तब तक यह मान बदलती निर्देशिकाओं के लिए उपयोगी रहेगा।

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))

# open class and do some stuff that changes directory

puts $MY_FILE_PATH

This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.मेरे परीक्षण के तहत पथ सही ढंग से विस्तारित हुआ। मेरा रूबी संस्करण 2.3.7 है, शायद नए रूबी संस्करण ने इस मुद्दे को ठीक कर दिया है।
अलेजोझो

28

__FILE__ फ़ाइल के विस्तार के साथ फ़ाइलनाम है जिसमें कोड निष्पादित किया जा रहा है।

में foo.rb, __FILE__"foo.rb" होगा।

अगर foo.rbदिर में होता /home/joshतो File.dirname(__FILE__)लौट जाता /home/josh


बिल्कुल इसी की तलाश में। +1: =) @ ईथन
केएम रकीबुल इस्लाम


17

रूबी में, Windows संस्करण वैसे भी, मैंने अभी जाँच की है और __FILE__इसमें फ़ाइल का पूरा पथ नहीं है। इसके बजाय इसमें फ़ाइल के लिए पथ सम्‍मिलित है जहां से इसे क्रियान्वित किया जा रहा है।

PHP __FILE__में पूर्ण पथ है (जो मेरी राय में बेहतर है)। यही कारण है कि, रूबी में अपने रास्तों को पोर्टेबल बनाने के लिए, आपको वास्तव में इसका उपयोग करने की आवश्यकता है:

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")

मुझे ध्यान देना चाहिए कि रूबी 1.9.1 __FILE__में फ़ाइल के लिए पूर्ण पथ शामिल है, उपरोक्त विवरण तब था जब मैंने रूबी 1.8.7 का उपयोग किया था।

रूबी 1.8.7 और 1.9.1 (1.9 के बारे में निश्चित नहीं) दोनों के साथ संगत होने के लिए, आपको ऊपर दिखाए गए निर्माण का उपयोग करके फ़ाइलों की आवश्यकता होनी चाहिए।


आपको अपने रिश्तेदार मार्ग पर एक स्लैश शुरू करने की आवश्यकता है:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
फेलिक्स राबे

3
आपको निर्देशिका विभाजक को कभी भी हार्ड-कोड नहीं करना चाहिए। इसके बजाय File.join का उपयोग करें: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
एंड्रयू हॉजकिंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.