2
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?

【Ruby】includeとprependとextend...ややこしや〜

Last updated at Posted at 2024-12-14

どうもこんにちは。

includeprependextend。Ruby初学者であれば誰もがつまづくでしょう。
簡単に解説します。(出力結果を比較しながら眺めてみてください。

基本的な動作

includeprependは大きく変わりません。この二つは、モジュール内のメソッドをインスタンスメソッドとして使用するためにインクルードするためのメソッドです。

extendは、モジュール内のメソッドをクラスメソッドとして使用するためにインクルードするためのメソッドです。

include

module Test_a
    def method_1
        puts 'method_1'
    end
end

class Test_b
    include Test_a
end

Test_b.new.method_1   #=> method_1

prepend

module Test_a
    def method_1
        puts 'method_1'
    end
end

class Test_b
    prepend Test_a
end

Test_b.new.method_1   #=> method_1

extend

module Test_a
    def method_1
        puts 'method_1'
    end
end

class Test_b
    extend Test_a
end

Test_b.method_1   #=> method_1

includeprependのややこしい探索順

よくRubyGoldの問題で問われるのが、継承チェーンの探索順ですが、includeprependの違いはここにあります。

includeを使用した例

includeを使用した場合、Personクラスのgreetメソッドが先に見つかります。

module Greetings
  def greet
    "Hello from Greetings module!"
  end
end

class Person
  include Greetings

  def greet
    "Hello from Person class!"
  end
end

person = Person.new
puts person.greet    #=> Hello from Person class!

prependを使用した例

includeを使用した場合、Greetingsモジュールのgreetメソッドが先に見つかります。

module Greetings
  def greet
    "Hello from Greetings module!"
  end
end

class Person
  prepend Greetings

  def greet
    "Hello from Person class!"
  end
end

person = Person.new
puts person.greet    #=> Hello from Greetings module!

extend selfという記述をしている問題が出てきた...

module Test_a
    def method_1
        puts 'method_1'
    end
end

module Test_m
    include Test_a
    extend self     # classでは`extend self`でエラーになるので注意!
end

Test_m.method_1       #=> method_1
Test_m.new.method_1   #=> undefined method `new' for Test_m:Module (NoMethodError)

extend selfが実行された場合、Test_mモジュール自身に対して自身のインスタンスメソッドをクラスメソッド(モジュールメソッド)として追加しています。

2
0
1

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
2
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?