Предшествующий к модулю, который включен / расширен

Я перехожу от использования Module#alias_method_chain в Module#prepend,

Но есть одна ситуация, когда я не могу достичь той же функциональности

Предположим, у меня есть код библиотеки (на самом деле две библиотеки, одна из которых расширяет другую)

# Library 1
object = Object.new
# Library 2
module Extender
  def random_number
    4
  end
end
object.extend Extender

object.random_number # => 4

Теперь скажи, что я хочу object#random_number вернуть 5. Мой старый код был

Extender.class_eval do
  def random_number_with_magic
    random_number_without_magic + 1
  end
  alias_method_chain :random_number, :magic
end

object.random_number # => 5

Чтобы имитировать это с помощью Module#prepend

module Prepender
  def random_number
    super + 1
  end
end
Extender.prepend Prepender

object.random_nuber # => still 4!

Желаемых результатов можно достичь двумя подходами

  • вызов Extender.prepend Prepender до object.extend Extender (не вариант, так как я не могу контролировать код во внешних библиотеках)
  • вызов object.extend Prepender вместо Extender.prepend Prepender (не вариант, так как object объект не виден снаружи)

Любой совет?

0 ответов

Другие вопросы по тегам