Я все время вижу это в Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Что означает __FILE__
?
Я все время вижу это в Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Что означает __FILE__
?
Это ссылка на текущее имя файла. В файле 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
Значение __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
__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), вы должны потребовать файлы, используя приведенную выше конструкцию.