1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

include/prepend/extendの違い

Last updated at Posted at 2023-05-02

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 の違いと用途です。適切に使い分けることで、コードの柔軟性と可読性を高めることができます。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?