我正在从 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
对象在外面不可见)
有什么建议吗?