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