Как понять разницу между class_eval() и instance_eval()?
Другой ответ правильный, но class-method позвольте мне немного углубиться.
Ruby instance-method имеет несколько различных ruby областей видимости; шесть class-method согласно wikipedia, хотя подробная class-method формальная документация, похоже, отсутствует. Неудивительно, что instance-method в этом вопросе используются ruby следующие виды области видимости: экземпляр и class-method класс.
Текущая область действия class-method экземпляра определяется значением ruby self
. Все неквалифицированные instance-method вызовы методов отправляются class-methods текущему экземпляру, как class-method и любые ссылки на переменные ruby экземпляра (которые выглядят instance-method как @this
).
Однако def
не является class-methods вызовом метода. Целью для ruby методов, созданных def
, является class-methods текущий класс (или модуль), который class-methods можно найти с помощью Module.nesting[0]
.
Давайте instance-method посмотрим, как два разных ruby варианта eval влияют на эти class-method области действия:
String.class_eval { [self, Module.nesting[0]] }
=> [String, String]
String.instance_eval { [self, Module.nesting[0]] }
=> [String, #
В обоих ruby случаях областью действия class-methods экземпляра является объект, для instance-method которого вызывается * _eval.
Для class-methods class_eval
область действия класса class-methods также становится целевым class-methods объектом, поэтому def
создает class-methods методы экземпляра для этого ruby класса / модуля.
Для instance_eval
областью class-methods действия класса становится ruby одноэлементный класс (также известный как метакласс, собственный instance-method класс) целевого объекта. Методы class-method экземпляра, созданные в одноэлементном ruby классе для объекта, становятся instance-method одноэлементными методами class-method для этого объекта. Одноэлементные ruby методы для класса или модуля ruby - это то, что обычно (и несколько ruby неточно) называется методами класса.
Область class-methods класса также используется class-methods для разрешения констант. Переменные ruby класса (@@these @@things
) разрешаются с помощью class-method области действия класса, но ruby они пропускают одноэлементные class-methods классы при поиске в цепочке class-methods вложенности модулей. Я нашел class-methods единственный способ получить class-method доступ к переменным класса class-methods в одноэлементных классах ruby - это использовать class_variable_get/set
.
ruby
class-method
instance-method
Как понять разницу между class_eval() и instance_eval()?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.