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

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

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.


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.