Edited at

include、extend、ActiveSupport::Concernざっくりまとめ

More than 3 years have passed since last update.


これはなに?

最近はお遊びコードじゃなくて、ちゃんとしたコードを読んで勉強しています。ももぞのです。

コードリーディングをしていて、ふとなんじゃこりゃと思ったコードのまとめです。

ただのメモ書きなので、めっちゃざっくりです。


class << self

特異クラス方式のクラスメソッド定義で使う。

一気に何個でもクラスメソッドが定義できる。

class User

class << self
def class_method1
end
def class_method2
end
end
end


self.method

1つだけクラスメソッドを定義するときに使う。

class User

def self.method
end
end


def hoge.method_name; end

特異メソッド。

hogeオブジェクトに対してのみ特定のメソッドを持たせるときに使う。


include

ざっくり表現:インスタンスメソッド読み込み

ClassにModuleを読み込み。いわゆるMix-in。

モジュールにモジュールをincludeすることもできる。

includedメソッドが中で呼ばれるらしい。

ちなみにこれだけだとクラスメソッドは別途指定しないと読み込めない。


extend

ざっくり表現:クラスメソッド読み込み


extendメソッドは、オブジェクトの特異クラスにモジュールを取り込み、モジュールのメソッドを特異メソッドとして使えるようにします。


クラスメソッドを定義するのと同じことか。


extend ActiveSupport::Concern

ナウいサービスでよく見るやつ。(いうてそんなに最近でもないか...

モジュールを読み込んだときにインスタンスメソッドもクラスメソッドも両方読み込める。


included do~end

extend ActiveSupport::Concernとセットで使われることが多い。

このブロック内にメソッドを定義しておくと、モジュールがincludeされたあとににそのメソッドが動作する。

module UserDelegatable 

extend ActiveSupport::Concern
included do
def notificate
p "includeされました"
end
end
end


参考

特異クラス・特異メソッド・メソッドの種類 Ruby - Qiita

Rubyのincludeとextendについて - QA@IT

ClassMethodsについて - CubicLouve

» Rails: includeされた時にクラスメソッドとインスタンスメソッドを同時に追加する頻出パターン TECHSCORE BLOG