51

Вопрос по ruby, language-implementation, syntax – Почему __FILE__ прописные и __dir__ строчные?

В Ruby 2.0.0-p0__dir__ переменная была введена для легкого доступа к каталогу исполняемого файла. Почему__dir__ в нижнем регистре, когда__FILE__ в верхнем регистре?

<span><code>__FILE__</code> является постоянным и<code>__dir__</code> это метод:<a href="http://permalink.gmane.org/gmane.comp.lang.ruby.core/52295">permalink.gmane.org/gmane.comp.lang.ruby.core/52295</a></span>

от texasbruce

<span><code>__FILE__</code> не является константой. В соответствии с<code>Kernel.const_get</code> это даже не допустимое имя для константы.</span>

от pascal betz

2 ответа

29

TL; DR

Относительные достоинства вариантов реализации языка выходят за рамки разумного вопроса переполнения стека. Тем не менее, это хороший вопрос, потому что он идентифицирует потенциально запутанный вариант использования в языке и стремится прояснить различие между двумя языковыми элементами.

Ключевые слова, методы и ключевые слова, похожие на методы

__FILE__ это ключевое слово

В Ruby 1.9__FILE__ это ключевое слово. Хотя он выглядит как метод, определенный в классе Object, источникОбъект #__ FILE__ говорит:

# File keywords.rb, line 68
def __FILE__
end

Быстрое сканирование источника в 2.0.0-p0Не включите файл keys.rb, но предполагается, что__FILE__ синтаксически остается ключевым словом. Возможно, кто-то еще может указать вам местоположение текущего определения.

__dir__ это метод

Kernel #__ dir__ это на самом деле метод. Вы можете убедиться в этом сами, разобрав ядроОпределенные методы:

Kernel.methods.grep /__dir__/
# => [:__dir__]

Ошибки и обсуждения

Дело в том, что__FILE__ является одновременно ключевым словом и (своего рода) методомвызвал в баг и немногосвязанный с ошибками комментарий, Было также обсуждение различных плюсов и минусов соглашения об именах вРубиновый Форум.

Хотя ответ может быть немного неудовлетворительным, этоС текущим состоянием дел. Если оно'В связи с проблемой языкового дизайна, к которой вы стремитесь присоединиться к основной команде Ruby, это будет правильным способом ее решения.

52

Я думаю, это потому, что__FILE__ постоянная времени разбора, тогда как__dir__ это функция и возвращаетFile.dirname(File.realpath(__FILE__))

Для получения более подробной информации см.Это обсуждение

Похожие вопросы