前置于包含/扩展的模块

时间:2016-01-21 14:41:21

标签: ruby-on-rails ruby prepend alias-method-chain

我从使用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 个答案:

没有答案