フックメソッドについて

特定のタイミングで実行されるものです。

意味不明だと思うので、解説します。

included

includeではありません、includedです。

なんとなく、見覚えがあったのですが、違いを全く理解していませんでした。

includedメソッドは、includeメソッドによってモジュールが他のモジュールやクラスにインクルードされたあとに呼び出されます。引数にはモジュールをインクルードするクラスやモジュールが入ります。

ref.xaio.jp

どういうことか、コードで説明します。

module Foo
  def self.included(klass)
    puts "#{klass}にincludeされました"
  end
end

class Bar
  include Foo
end
=>Barにincludeされました

includeしたタイミングで上のputsが反応しています。

これを利用して、特異メソッド化する手法がよく使われます。

module Foo
  def self.included(klass)
    puts "#{klass}にincludeされました"
    klass.extend Methods
  end

  module Methods
    def foo
      'foo'
    end
  end
end

class Bar
  include Foo
end
Bar.foo
=> "foo"

extendでMethodsをBarのみに使用できるようにしています。 これでincludeした場合に特異メソッド化ができます。

includedは単なるフックメソッドとして、使用されており、inlucdeとは全く違うものでした。

ここの理解を全くしていなかったな。