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