1. ホーム
  2. ルビー

[解決済み】Rubyのincludeとextendの違いって何?

2022-03-24 10:18:03

質問

Rubyのメタプログラミングについて頭を抱えているところです。mixin/moduleはいつも私を混乱させます。

  • インクルード として指定されたモジュールのメソッドを混在させます。 インスタンスメソッド ターゲットクラスで
  • 拡張 として指定されたモジュールのメソッドを混在させます。 クラスメソッド ターゲットクラスで

では、大きな違いはこれだけなのか、それとももっと大きなドラゴンが潜んでいるのか?

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!"

解決方法は?

おっしゃるとおりです。しかし、それだけではありません。

もし、クラス Klazz とモジュール Mod を含む。 ModKlazz のインスタンスを生成します。 Klazz にアクセスすることができます。 Mod のメソッドを使用します。あるいは KlazzMod を与える。 クラス Klazz にアクセスする。 Mod のメソッドを使用します。しかし、任意のオブジェクトを o.extend Mod . この場合、個々のオブジェクトは Mod と同じクラスを持つ他のすべてのオブジェクトが同じメソッドを持つにもかかわらず o はしない。