Що означає __FILE__ у Ruby?


Відповіді:


146

Це посилання на поточну назву файлу. У файлі 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

88
Ця відповідь не є точною. FILE - це "відносний" шлях до файлу з поточного каталогу виконання, а не абсолютний. Ви повинні використовувати File.expand_path ( FILE ), щоб отримати абсолютний шлях
Luke Bayes,

7
Подвійне підкреслення було автоматично видалено в коментарі вище.
Люк Байєс,

1
це все ще правда в ruby ​​1.9.2?
Zasz

4
@Zasz Це працює по-різному в 1.9.2. Спочатку завантажений файл має відносний __FILE__, але інші включені / необхідні файли мають абсолютні шляхи.
Джефф

9
@LukeBayes Ви можете зберегти підкреслення та інші спеціальні символи в коментарях Stack Overflow, оточивши буквальний текст зворотними позначками. Пишіть, `__FILE__`щоб отримати __FILE__.
Рорі О'Кейн,

63

Значення __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 ​​вирішила цю проблему.
Alec.Zhou

28

__FILE__ - це ім'я файлу з розширенням файлу, що містить виконуваний код.

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

Якби foo.rbбули в папці, /home/joshто File.dirname(__FILE__)повернулися б /home/josh.


Точно шукаю це. +1: =) @Ethan
KM Rakibul Islam

1
Посилання на документацію тут
Росс Атрілл

17

У 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")
Фелікс Рабе

3
Ніколи не слід кодувати роздільник каталогів. Замість цього використовуйте File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Ендрю Ходжкінсон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.