Что означает __FILE__ в Ruby?

Ответы:

144

Это ссылка на текущее имя файла. В файле foo.rb, __FILE__будет интерпретироваться как "foo.rb".

Изменить: Ruby 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
Geoff
источник
87
Этот ответ не точен. FILE - это «относительный» путь к файлу из текущего каталога выполнения, а не абсолютный. Вы должны использовать File.expand_path ( FILE ), чтобы получить абсолютный путь
Люк Байес,
7
Двойные подчеркивания были автоматически удалены в комментарии выше.
Люк Байес
1
это все еще верно в ruby ​​1.9.2?
Zasz
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.Путь расширился правильно по моему тесту. Моя версия ruby ​​2.3.7, возможно, более новая версия ruby ​​исправила эту проблему.
Alec.Zhou
28

__FILE__ это имя файла с расширением файла, содержащего исполняемый код.

В foo.rb, __FILE__будет "foo.rb".

Если бы foo.rbбыли в режиссере, /home/joshто File.dirname(__FILE__)вернулись бы /home/josh.

Итан
источник
Точно искал это. +1: =) @Ethan
К.М. Ракибул Ислам
1
Ссылка на документацию здесь
Росс Аттрилл
17

В Ruby, версия для Windows в любом случае, я только что проверил и __FILE__не содержит полный путь к файлу. Вместо этого он содержит путь к файлу относительно того, откуда он выполняется.

В PHP __FILE__это полный путь (который на мой взгляд предпочтительнее). Вот почему, чтобы сделать ваши пути переносимыми в Ruby, вам действительно нужно использовать это:

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

Я должен отметить, что в Ruby 1.9.1 __FILE__содержится полный путь к файлу, приведенное выше описание было для того, когда я использовал Ruby 1.8.7.

Для совместимости с Ruby 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") )
Эндрю Ходжкинсон