Ruby では、以下の3つの方法でクラスにモジュールを取り込むことができます。
メソッド | 説明 |
---|---|
include | *モジュールのメソッドをクラスのインスタンスメソッドとして定義する *既に同名のインスタンスメソッドがある場合、そのメソッドを上書き |
prepend | *モジュールをクラスの継承チェーンの先頭に挿入し、挿入されたモジュールのメソッドがクラスのインスタンスメソッドとして定義される *同名のインスタンスメソッドがある場合、クラスのインスタンスメソッドよりも優先してモジュールのメソッドが呼ばれる |
extend | *モジュールに定義されたメソッドをクラスメソッドとして使用可能 |
include
include は、指定されたモジュールをクラス内にミックスインするためのメソッドです。ミックスインすることで、クラス内でそのモジュールに定義されたインスタンスメソッドを使用できるようになります。include によって取り込まれたモジュールのメソッドは、クラスのインスタンスメソッドとして定義されます。
module MyModule
def my_method
puts "Hello, world!"
end
end
class MyClass
include MyModule
end
obj = MyClass.new
obj.my_method #=> "Hello, world!"
prepend
prepend は、指定されたモジュールをクラス内に先頭に挿入するためのメソッドです。prepend によって取り込まれたモジュールのメソッドは、クラスのインスタンスメソッドとして定義されます。ただし、同名のインスタンスメソッドが既に定義されている場合は、モジュールによる上書きが行われます。prepend によって挿入されたモジュールのメソッドは、クラスのインスタンスメソッドとして定義されます。
module MyModule
def my_method
puts "Hello, world!"
end
end
class MyClass
prepend MyModule
def my_method
puts "Goodbye, world!"
end
end
obj = MyClass.new
obj.my_method #=> "Goodbye, world!"
extend
extend は、指定されたモジュールをクラスに特異メソッドとして追加するためのメソッドです。モジュールに定義されたメソッドは、クラスのインスタンスメソッドとしてではなく、クラスメソッドとして使用できるようになります。
module MyModule
def my_method
puts "Hello, world!"
end
end
class MyClass
extend MyModule
end
MyClass.my_method #=> "Hello, world!"
以上が、include、prepend、extend の違いと用途です。適切に使い分けることで、コードの柔軟性と可読性を高めることができます。