モジュールの用途
・Rubyは単一継承のため、1つのクラスには1つのスーパークラスしか持てないので、複数のインスタンスメソッド、クラスメソッドを継承関係で使用したいときにモジュールを使用→Mix-in
・namespace(名前空間)の作成
・シングルトンオブジェクトのように扱って設定値などを保持する
Mix-inする方法
・extend
→モジュール内のメソッドをそのクラスの特異メソッド(つまりクラスメソッド)にすることができる。
・include
→モジュール内のメソッドをそのクラスのインスタンスメソッドにすることができる。
あるクラスに特定のモジュールがincludeされているか確認する方法
module Loggable
end
class Product
include Loggable
end
上記のような、Productクラス内でLoggableモジュールをincludeしているコードがあったとします。
Product.include?(Loggable)
=> true
クラスオブジェクトに対してinclude?メソッドを呼ぶと引数で渡したモジュールがincludeされているかどうか確認することができます。
Product.included_modules
=>[Loggable,Kernel]
included_modulesメソッドを使用することで、includeされているモジュールの配列が返します。
※Kernelモジュールは、ProductのスーパークラスであるObjectクラスでincludeされているモジュールです。
(Kernelモジュールのリファレンスマニュアル)
https://docs.ruby-lang.org/ja/latest/class/Kernel.html
Product.ancestors
=> [Product, Loggable, Object, Kernel, BasicObject]
ancestorsメソッドを使用することでモジュールだけでなく、スーパークラスの情報も配列になって返すことができます。
product = Product.new
product.class.include?(Loggable)
=> true
product.class.included_modules
=> [Loggable, Kernel]
classメソッドを使用することで、クラスオブジェクトだけでなく、クラスのインスタンスからもincludeされているモジュールの情報が取得することができます。
Product.superclass
=> Object
superclassメソッドでスーパークラスを表示することもできます。
【参考記事】
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで(書籍)