Issue #10355 has been updated by Satoshi TAGOMORI.
ある機能が prepend によって追加されているかどうかを調べたいときに Module#include? では不十分です。
継承関係の親クラスにおいて prepend されたモジュールのメソッドは、子クラスでも定義が存在する場合、実際には呼び出されません。
module P
def myname
str = super
"p" + str
end
end
class X
def myname
"x"
end
prepend P
end
X.include?(P) #=> true
X.new.myname #=> "px"
class Y < X
def myname
"y"
end
end
Y.include?(P) #=> true
Y.new.myname #=> "y" # without prepended method
以下の方法で調べることは可能ですが冗長な上、Moduleクラスへのモンキーパッチも
通常の用途ではためらわれるため、標準でサポートされていると助かります。
class Module
def prepended?(mod)
self.ancestors.include?(mod) && self.ancestors.index(mod) <
self.ancestors.index(self)
end
end
Feature #10355: Feature request: Module#prepended?(mod)
- Author: Satoshi TAGOMORI
- Status: Open
- Priority: Normal
- Assignee:
- Category:
- Target version:
あるモジュール X に対してモジュール P1 がprependされているかどうかを調べる方法があると嬉しく思います。
Module#include?
を使うと継承関係に含まれているかどうかはわかりますが、それが対象モジュールに対してprependされたものかは分かりません。
module P1; end module P2; end class X prepend P1 end class Y< X prepend P2 end X.include?(P1) #=> true Y.include?(P2) #=> true Y.include?(P1) #=> true # I want X.prepended?(P1) #=> true Y.prepended?(P2) #=> true Y.prepended?(P1) #=> false