Ruby の include と extend の違いは何ですか?
概要
Ruby のメタプログラミングについて少し理解しているところです。ミックスインやモジュールはいつも私を混乱させます。
では、大きな違いはこれだけなのでしょうか、それともさらに大きなドラゴンが潜んでいるのでしょうか? 例えば
module ReusableModule
def module_method
puts "Module Method: Hi there!"
end
end
class ClassThatIncludes
include ReusableModule
end
class ClassThatExtends
extend ReusableModule
end
puts "Include"
ClassThatIncludes.new.module_method # "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method # "Module Method: Hi there!"
解決策
extend - 指定されたモジュールのメソッドと定数をターゲットのメタクラス (つまり、シングルトン クラス) に追加します。 例えば
include - デフォルトでは、指定されたモジュールのメソッドをターゲット モジュール/クラスのインスタンス メソッドとして混合します。 例えば
ただし、モジュールは、インクルードされたメソッドにモンキーパッチを適用することで、インクルードの動作をオーバーライドすることがよくあります。これは従来の Rails コードで非常に顕著です。詳細はイェフダ・カッツから。
次のコードを実行したと仮定した場合の、デフォルトの動作での include の詳細
class Klazz
include Mod
end
もちろん、これらのことについては、Ruby コアのドキュメントが常に最適な場所です。 RubySpec プロジェクトも、機能を正確に文書化しているため、素晴らしいリソースでした。