From: tagomoris@... Date: 2014-10-10T03:56:16+00:00 Subject: [ruby-dev:48611] [ruby-trunk - Feature #10355] Feature request: Module#prepended?(mod) 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) https://bugs.ruby-lang.org/issues/10355#change-49333 * 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
-- https://bugs.ruby-lang.org/