Я постійно бачу це в Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Що __FILE__
означає?
Відповіді:
Це посилання на поточну назву файлу. У файлі 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") )