モジュールについて

モジュールの定義

 module Greet
   def hello
      'hello'
   end
 end

クラス定義によく似ています。しかし、モジュールはクラスと異なる点があります。

  • モジュールからインスタンスを作成することはできない

  • 他のモジュールからクラスを継承することはできない

 name = Name.new # => モジュールのインスタンスは作成できない
 
module CategoryName < Name # => 他のモジュールを継承して新しいモジュールを作ることはできない
end


include

 module Greet
   def hello
      'hello'
   end
 end

 class User
    include Greet
 end 

 user = User.new

 puts user.hello # => hello

モジュールに定義したhelloメソッドをUserクラスで呼び出すことができます。このモジュールがあれば、他のクラスでも継承関係を気にすることなくログ出力を持つことができます。

このようにモジュールをクラスにincludeして機能を追加することをミックスインと言います。

また、1つのクラスに複数のモジュールをミックスインすることもできます。

  module Greet
   def hello
      'hello'
   end
 end

 class User
    include Greet
 end 

 puts user.hello # => クラスメソッドとして呼び出せない!

クラスにモジュールをincludeした場合は、クラスで呼び出せるのはモジュールのインスタンスメソッドで、includeしたクラスのインスタンスメソッドとして呼び出すことが出来ます。



extend

extendを使うと、モジュール内のメソッドをそのクラスのクラスメソッドにすることができます。

   module Greet
   def hello
      'hello'
   end
 end

 class User
    extend Greet
 end 

 puts user.hello # => hello



名前空間を分けて名前の衝突を防ぐ

 module User
   class Greeting
     def hello
        'hello'
     end
   end
 end

  module Author
   class Greeting
     def hello
        'こんにちは'
     end
   end
 end

モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるため、同名クラスがあっても外側のモジュール名さえ異なっていれば名前の衝突は発生しなくなります。

 User::Greeting.new

Author::Greeting.new