LoginSignup
5
1

More than 5 years have passed since last update.

クラス内にモジュールがincludeされているか確認する方法

Last updated at Posted at 2019-03-20

モジュールの用途

・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入門 言語仕様からテスト駆動開発・デバッグ技法まで(書籍)

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1