Действительно ли возможно инвертировать включенный модуль в классе?

С точки зрения создания полноценного приложения, я считаю, что процесс разработки такой же, но компиляция и подготовка двоичного кода различны. Предоставленная ссылка является хорошим ресурсом

Если вы намереваетесь сделать твик, который подключается к существующим классам и методам Apple, тогда вам нужно что-то вроде theos от DHowett, хороший базовый учебник находится здесь

9
задан Andrew Grimm 16 May 2011 в 23:06
поделиться

2 ответа

Детали зависят от реализации, но я знаю, что, по крайней мере, в JRuby и MRI 1.8 есть конструкция, называемая классом включения, которая вставляется в цепочку наследования класса, когда модуль расширенный или включенный. Таким образом, модуль не будет собираться сборщиком мусора, поскольку класс Include по-прежнему ссылается на него, а методы по-прежнему будут в вашем классе. Патрик Фарли опубликовал несколько замечательных статей по этой и смежным темам в его блоге .

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

9
ответ дан 4 December 2019 в 14:30
поделиться

Когда вы включаете миксин в класс, вы эффективно добавляете методы, определенные в модуле, в класс или замена методов в классе на методы в модуле с тем же именем. Класс не имеет никакой связи с модулем, поэтому «удаление» модуля M не повлияет на класс C . Все, что это делает, - это мешает вам смешивать M за пределами этой точки.

Вы можете использовать undef_method для удаления методов из класса C , но это будет иметь побочные эффекты, потенциально - если метод был переопределен включением модуля, вы, например, не получите обратно оригинал. Неопределение метода класса уродливо.

C.send(:undef_method, :instance_method_from_module)
class << C
  self
end.send(:undef_method, :class_method_from_module)
5
ответ дан 4 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

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