3

我正在从 usingModule#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对象在外面不可见)

有什么建议吗?

4

0 回答 0