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

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

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

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

Ответ 1

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

Изменить: Ruby 1.9.2 и 1.9.3 выглядят несколько иначе, чем Luke Bayes в его комментарии. С этими файлами:

# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__

Запуск ruby test.rb выводит

test.rb
/full/path/to/dir2/test.rb

Ответ 2

Значение __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

Ответ 3

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

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

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

Ответ 4

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