3

から に移行してModule#alias_method_chainModule#prependます。

しかし、同じ機能を実現できない状況が 1 つあります。

ライブラリ コードがあるとします (実際には 2 つのライブラリがあり、そのうちの 1 つは別のライブラリを拡張します)。

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

object.random_number # => 4

ここで、5 を返したいobject#random_numberとします。私の古いコードは

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!

望ましい結果は、2 つのアプローチによって達成できます。

  • Extender.prepend Prepender 前に 呼び出すobject.extend Extender(外部ライブラリのコードを制御できないため、オプションではありません)
  • object.extend Prepender の代わりに呼び出します (オブジェクトは外部に表示されないExtender.prepend Prependerため、オプションではありません)object

何かアドバイス?

4

0 に答える 0