から に移行してModule#alias_method_chain
いModule#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
何かアドバイス?