Что означает __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

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") )
Эндрю Ходжкинсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.