Ответы:
Это ссылка на текущее имя файла. В файле 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
`__FILE__`
чтобы получить __FILE__
.
Значение __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 исправила эту проблему.
__FILE__
это имя файла с расширением файла, содержащего исполняемый код.
В foo.rb
, __FILE__
будет "foo.rb".
Если бы foo.rb
были в режиссере, /home/josh
то File.dirname(__FILE__)
вернулись бы /home/josh
.
В 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")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )