Module.included

7つの言語 7つの世界

7つの言語 7つの世界


「7つの言語 7つの世界」を読んでいて、 Ruby のところは流し読みでも良いだろうと思っていたら Module のメソッド included というのが出てきて、なんだっけという具合になった。

included は include 後に呼び出されるメソッドで、引数に インクルードしたクラスやモジュールが入ってくる。以下のように使ったりする。

モジュールを include するとモジュールに def self.uma; end とかで定義したようなモジュールメソッドがクラスメソッドとして取り込まれそうという期待があるけど、そんなことはなくて、include ではモジュールメソッドを取り込むことができない。

モジュールのメソッドをクラスメソッドとして取り込みたい時はクラスの文脈で extend すれば良いだけなんだけど、モジュールの機能をインスタンスメソッドとクラスメソッドに振り分けたいというワガママもいるみたいで、それを実現するのが included を使った上のコードになる。

included は include された後にインクルードする側のクラスorモジュールを引数として呼ばれるので、そのクラスorモジュールにクラスメソッドとして取り込みたい機能をもったモジュール(例ではClassMethods)を extend してあげれば、ワガママが実現する。

メタプロRubyでは Merb の実装を解説する辺りでクラス拡張ミックスインという用語で出てきているんだけど、普通に覚えてないし精進♪精進♪

こういう他の言語のディープっぽい話まで「7つの言語 7つの世界」で教えてもらえるのかと期待している。

ちなみに、 include の前に呼ばれるのは append_features で、引数のクラスorモジュールに機能を取り込むという、include の実質的な部分になっている。