Techioz Blog

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 プロジェクトも、機能を正確に文書化しているため、素晴らしいリソースでした。