Co oznacza __FILE__ w Ruby?

Odpowiedzi:

144

Jest to odniesienie do bieżącej nazwy pliku. W pliku foo.rb, __FILE__zostanie zinterpretowane jako "foo.rb".

Edycja: Ruby 1.9.2 i 1.9.3 zachowują się nieco inaczej niż to, co powiedział Luke Bayes w swoim komentarzu . Z tymi plikami:

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

Uruchomienie ruby test.rbspowoduje wyjście

test.rb
/full/path/to/dir2/test.rb
Geoff
źródło
87
Ta odpowiedź nie jest dokładna. PLIK jest „względną” ścieżką do pliku z bieżącego katalogu wykonania - nie absolutną. Musisz użyć File.expand_path ( FILE ), aby uzyskać absolutną ścieżkę
Luke Bayes
7
Podwójne podkreślenia zostały automatycznie usunięte w powyższym komentarzu.
Luke Bayes
1
czy to wciąż prawda w Ruby 1.9.2?
Zasz
4
@Zasz Działa to trochę inaczej w 1.9.2. Początkowo załadowany plik ma względne __FILE__, ale inne dołączone / wymagane pliki mają bezwzględne ścieżki.
Geoff,
9
@LukeBayes Możesz zachować podkreślenia i inne znaki specjalne w komentarzach Przepełnienie stosu, otaczając dosłowny tekst odwrotnymi znakami. Napisz, `__FILE__`aby dostać __FILE__.
Rory O'Kane,
62

Wartością __FILE__jest ścieżka względna, która jest tworzona i przechowywana (ale nigdy nie aktualizowana) podczas ładowania pliku. Oznacza to, że jeśli masz jakieś połączenia z Dir.chdirdowolnym innym miejscem w aplikacji, ścieżka ta zostanie nieprawidłowo rozwinięta.

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

Jednym z obejść tego problemu jest przechowywanie rozszerzonej wartości __FILE__poza dowolnym kodem aplikacji. Tak długo, jak twoje requireinstrukcje znajdują się na górze definicji (lub przynajmniej przed wywołaniami do Dir.chdir), ta wartość będzie nadal przydatna po zmianie katalogów.

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

# open class and do some stuff that changes directory

puts $MY_FILE_PATH
Luke Bayes
źródło
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.Ścieżka rozszerzyła się poprawnie podczas mojego testu. Moja wersja ruby ​​to 2.3.7, być może nowsza wersja ruby ​​naprawiła ten problem.
Alec.Zhou,
28

__FILE__ to nazwa pliku z rozszerzeniem pliku zawierającego wykonywany kod.

W foo.rb, __FILE__byłoby „foo.rb”.

Jeśli foo.rbbyły w reż /home/joshnastępnie File.dirname(__FILE__)wróci /home/josh.

Ethan
źródło
Właśnie tego szukam. +1: =) @Ethan
KM Rakibul Islam 18.12.12
1
Link do dokumentacji tutaj
Ross Attrill
17

W Ruby, wersja dla systemu Windows i tak, właśnie sprawdziłem i __FILE__nie zawiera pełnej ścieżki do pliku. Zamiast tego zawiera ścieżkę do pliku względem miejsca, z którego jest wykonywany.

W PHP __FILE__jest pełna ścieżka (która moim zdaniem jest lepsza). Dlatego, aby twoje ścieżki były przenośne w Rubim, naprawdę musisz użyć tego:

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

Powinienem zauważyć, że w Ruby 1.9.1 __FILE__zawiera pełną ścieżkę do pliku, powyższy opis dotyczył kiedy użyłem Ruby 1.8.7.

Aby być kompatybilnym zarówno z Ruby 1.8.7, jak i 1.9.1 (nie jestem pewien co do wersji 1.9), powinieneś wymagać plików za pomocą konstrukcji pokazanej powyżej.

Matt Wolfe
źródło
Musisz dodać ukośnik do swojej ścieżki względnej:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe,
3
Nigdy nie należy na stałe kodować separatora katalogów. Zamiast tego użyj pliku File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Andrew Hodgkinson,