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

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

211 голосов
/ 22 октября 2008

Я вижу это все время в Ruby:

require File.dirname(__FILE__) + "/../../config/environment"  

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

Ответы [ 4 ]

142 голосов
/ 22 октября 2008

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

Edit: 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
61 голосов
/ 21 мая 2009

Значение __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
28 голосов
/ 02 декабря 2008

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

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

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

17 голосов
/ 24 апреля 2009

В 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) вам потребуются файлы с использованием конструкции, которую я показал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...