Существует три неявных контекста в Ruby :
self
(контекст для отправки сообщений без получения и переменных экземпляра) - the определение по умолчанию (контекст для
def
выражений определения метода без явной цели, т.е. def bar
вместо def foo.bar
) - точка определения константы по умолчанию
К сожалению, хотя в статье, на которую я ссылался выше, перечислены все три из них, в ней рассматриваются только первые две и откладывается точка определения константы по умолчанию до более поздней статьи, которая никогда не была написана.
В любом случае, важно помнить об этих трех контекстах и знать, когда они изменяются, а когда нет.
В частности, блок only меняет лексический контекст и ничего больше .Блок не меняет self
, он не меняет стандартное определение и не меняет стандартную точку определения константы .
Однако есть некоторыеметоды, для которых явное предназначено для изменения одного или нескольких из этих трех контекстов.
Семейство методов *_eval
меняет self
(контекст # 1) и определитель по умолчанию (контекст)# 2), но не меняет точку определения константы по умолчанию (контекст # 3).В частности, все методы *_eval
(*_exec
) устанавливают self
для получателя.Версии instance_*
устанавливают определение по умолчанию для одноэлементного класса получателя, версии module_*
и class_*
устанавливают определение по умолчанию для получателя.
Однако точка определения константы по умолчанию равна не изменено, поэтому определение константы (и поиск) работает так же, как и раньше: определения переходят к определению ближайшего лексически заключенного модуля, поиск начинается с определения ближайшего лексически заключающего модуля и продолжается лексически наружу и динамически вверх -by-наследование.
Насколько я мог найти, только конструкция , которая изменяет стандартную точку определения константы, является определением module
/ class
.