В Ruby 2.0.0-p0 переменная __dir__
была введена для облегчения доступа к каталогу исполняемого файла.
Почему __dir__
в нижнем регистре, когда __FILE__
в верхнем регистре?
В Ruby 2.0.0-p0 переменная __dir__
была введена для облегчения доступа к каталогу исполняемого файла.
Почему __dir__
в нижнем регистре, когда __FILE__
в верхнем регистре?
Я думаю, это потому, что __FILE__
- это константа времени синтаксического анализа, тогда как __dir__
- это функция и возвращает File.dirname(File.realpath(__FILE__))
Для получения дополнительных сведений см. Это обсуждение а>
Относительные достоинства выбора языковой реализации выходят за рамки разумного вопроса о переполнении стека. Однако это хороший вопрос, потому что он определяет потенциально запутанный вариант использования языка и пытается прояснить различие между двумя языковыми элементами.
__FILE__
- ключевое словоВ Ruby 1.9 __FILE__
- ключевое слово. Хотя он выглядит как метод, определенный в классе Object, источник для Объект №__ FILE__ говорит:
# File keywords.rb, line 68
def __FILE__
end
Быстрое сканирование источника в 2.0.0-p0 не выявило файла keywords.rb, но предполагается, что __FILE__
синтаксически остается ключевым словом. Возможно, кто-то другой сможет указать вам на местоположение текущего определения.
__dir__
- это методЯдро #__ dir__ на самом деле является методом. Вы можете убедиться в этом сами, нажав определенные методы ядра:
Kernel.methods.grep /__dir__/
# => [:__dir__]
Тот факт, что __FILE__
является одновременно ключевым словом и (своего рода) методом, вызван ошибкой и некоторые комментарии об ошибках. Также обсуждались различные плюсы и минусы соглашения об именах в Форум по Ruby-Core.
Хотя ответ может быть несколько неудовлетворительным, но таково текущее положение дел. Если вы серьезно относитесь к проблеме языкового дизайна, участие в команде разработчиков ядра Ruby было бы правильным способом ее решения.
__FILE__
является константой, а__dir__
- методом: permalink.gmane.org/gmane. comp.lang.ruby.core / 52295 - person texasbruce   schedule 04.03.2013__FILE__
не является константой. СогласноKernel.const_get
, это даже недопустимое имя для константы. - person Pascal   schedule 11.01.2016