Cały czas widzę to w Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Co __FILE__znaczy
Cały czas widzę to w Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Co __FILE__znaczy
Odpowiedzi:
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
`__FILE__`aby dostać __FILE__.
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.
__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 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.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )