モジュールの定義
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