__FILE__, Ruby'de ne anlama geliyor?


Yanıtlar:


144

Geçerli dosya adına bir referanstır. Dosyada foo.rb, __FILE__olarak yorumlanır "foo.rb".

Edit: Ruby 1.9.2 ve 1.9.3 Luke Bayes'in yorumunda söylediklerinden biraz farklı davranıyor gibi görünüyor . Bu dosyalarla:

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

Koşu ruby test.rbçıkacak

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

87
Bu cevap doğru değil. FILE , geçerli yürütme dizinindeki dosyanın "göreli" yoludur - mutlak değil. Mutlak yolu elde etmek için File.expand_path ( FILE ) kullanmalısınız
Luke Bayes

7
Yukarıdaki açıklama dahilinde çift alt çizgi otomatik olarak kaldırıldı.
Luke Bayes

1
1.9.2'de bu hala geçerli mi?
Zasz

4
@Zasz 1.9.2'de biraz farklı çalışıyor. Başlangıçta yüklenen dosya göreli bir __FILE__ dosyasına sahiptir, ancak dahil edilen / gerekli diğer dosyaların mutlak yolları vardır.
Geoff

9
@LukeBayes Yığın Taşması yorumlarında, değişmez metni ters tırnaklarla çevreleyerek alt çizgileri ve diğer özel karakterleri koruyabilirsiniz. Almak `__FILE__`için yazın __FILE__.
Rory O'Kane

62

Değeri, __FILE__dosyanız yüklendiğinde oluşturulan ve depolanan (ancak hiçbir zaman güncellenmeyen) göreli bir yoldur. Bu Dir.chdir, uygulamanızın başka bir yerine herhangi bir çağrınız varsa bu yolun yanlış genişleyeceği anlamına gelir .

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

Bu soruna geçici bir çözüm __FILE__, herhangi bir uygulama kodunun dışında genişletilmiş değerini depolamaktır . Sürece olarak requireekstrelerinin bulunduğu tanımları üst kısmında (veya çağrılmadan önce en azından Dir.chdir), bu değer dizinleri değiştirdikten sonra yararlı olmaya devam edecektir.

$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.Testimde yol doğru genişledi. Benim yakut sürümü 2.3.7, belki daha yeni yakut sürümü bu sorunu düzeltti.
Alec.Zhou

28

__FILE__ yürütülmekte olan kodu içeren dosya uzantısına sahip dosya adıdır.

In foo.rb, __FILE__"foo.rb" olurdu.

Eğer foo.rbdir vardı /home/josho File.dirname(__FILE__)zaman dönecekti /home/josh.


Tam olarak bunu arıyorum. +1: =) @Ethan
KM Rakibul Islam


17

Ruby'de, Windows sürümü zaten, sadece kontrol ettim ve __FILE__dosyanın tam yolunu içermiyor. Bunun yerine dosyanın yürütüldüğü yere göre yolu içerir.

PHP __FILE__tam yoludur (Bence tercih edilir). Bu nedenle, yollarınızı Ruby'de taşınabilir hale getirmek için bunu gerçekten kullanmanız gerekir:

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

Ruby 1.9.1'de __FILE__dosyanın tam yolunu içerdiğini, yukarıdaki açıklamanın Ruby 1.8.7'yi kullandığım için olduğunu belirtmeliyim.

Hem Ruby 1.8.7 hem de 1.9.1 (1.9 hakkında emin değilim) ile uyumlu olabilmek için yukarıda gösterdiğim yapıyı kullanarak dosyalara ihtiyacınız var.


Göreceli yolunuza bir eğik çizgi eklemeniz gerekir:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe

3
Asla dizin ayırıcıyı kodlamamalısınız. Bunun yerine File.join kullanın:File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.