拡張- 指定されたモジュールのメソッドと定数をターゲットのメタクラス (つまり、シングルトン クラス) に追加します。
- を呼び出すと
Klazz.extend(Mod)
、Klazz は Mod のメソッドを (クラス メソッドとして) 持っています。
- を呼び出すと
obj.extend(Mod)
、obj には Mod のメソッド (インスタンス メソッドとして) が含まれますが、obj.class
これらのメソッドが追加された の他のインスタンスはありません。
extend
パブリックメソッドです
include - デフォルトでは、指定されたモジュールのメソッドをターゲット モジュール/クラスのインスタンス メソッドとして混合します。例えば
- を呼び出すと
class Klazz; include Mod; end;
、Klazz のすべてのインスタンスが Mod のメソッドに (インスタンス メソッドとして) アクセスできるようになります。
include
コンテナクラス/モジュール内から呼び出されることを意図しているため、プライベートメソッドです。
ただし、モジュールは、メソッドにモンキー パッチを適用することによって、 の動作をオーバーライド することがよくあります。これは、従来の Rails コードでは非常に顕著です。詳細は Yehuda Katz から。include
included
include
次のコードを実行したと仮定した場合の、デフォルトの動作に関する の詳細
class Klazz
include Mod
end
- Mod がすでに Klazz またはその祖先の 1 つに含まれている場合、include ステートメントは効果がありません
- 衝突しない限り、Klazz の Mod の定数も含まれます。
- これにより、Klazz は Mod のモジュール変数にアクセスできます
@@foo
。@@bar
- 循環インクルードがある場合は ArgumentError を発生させます
- モジュールを呼び出し元の直接の祖先としてアタッチします (つまり、Mod を Klazz.ancestors に追加しますが、Mod は Klazz.superclass.superclass.superclass のチェーンには追加されません。したがって、
super
Klazz#foo を呼び出すと、チェックの前に Mod#foo がチェックされます。 Klazz の実際のスーパークラスの foo メソッドに (詳細については RubySpec を参照してください)。
もちろん、Ruby コア ドキュメントは常に、これらのことを行うのに最適な場所です。RubySpec プロジェクトも素晴らしいリソースでした。機能を正確に文書化したからです。