Как понять разницу между 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

2022-08-07T03:43:30+00:00
Вопросы с похожей тематикой, как у вопроса:

Как понять разницу между class_eval() и instance_eval()?