Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@ksh-fthr

[Ruby] モジュールの include と prepend-[1]

More than 1 year has passed since last update.

モジュールを include したときと prepend したときでは継承順序が異なる.
結果, 同じモジュールを include したときと prepend したときでは当然挙動が変わってくる.

確認環境

  • Ruby v2.3.7p456

モジュール定義とクラス定義

define_module_define_class.rb
# まずはモジュール定義
module M
  def hoge
    puts "hoge is defined by module"
  end
end

# 定義したモジュールを include するクラス
class ClsInludeModule
  include M
  def hoge
    super
    puts "hoge is defined by ClsIncludeModule"
  end
end

# 定義したモジュールを prepend するクラス
class ClsPrependModule
  prepend M
  def hoge
    super
    puts "hoge is defined by ClsPrependModule"
  end
end

継承関係の確認

verify_inheritane.rb
# モジュールを include したクラス
ClsInludeModule.ancestors # :=> [ClsInludeModule, M, Object, Kernel, BasicObject]

# 継承関係の確認(モジュールを prepend したクラス)
ClsPrependModule.ancestors # :=> [M, ClsPrependModule, Object, Kernel, BasicObject]

挙動の確認

verify_behavior.rb
# モジュールを include したクラス
ClsInludeModule.new.hoge # :=> hoge is defined by module
                         # :=> hoge is defined by ClsIncludeModule

# モジュールを prepend したクラス
ClsPrependModule.new.hoge # :=> hoge is defined by module

結論

  • モジュールを include した場合

    • モジュールは include を行ったクラスの 「上」に来る
    • したがって同名メソッドが定義されている場合, super で呼び出した際には モジュールのメソッドが実行される
  • モジュールを prepend した場合

    • モジュールは prepend を行ったクラスの 「下」に来る
    • この場合, prepend を行ったクラスのメソッドは prepend したモジュールのもので オーバーライド される
    • したがって prepend を行ったクラスのメソッドは実行されない
4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ksh-fthr
フロントエンドは Angular, バックエンドは Express / axios / Sequelize 等を使ってました。今は AWS で奮闘中。あと Docker 使って環境構築なんかにも手をだしてます。 モノをつくって共有、というよりはその過程で得たものを共有できればいいなぁと思ってます。 どうぞよろしくお願いします。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?