include

モジュールをインクルードする。モジュールは継承チェインの後ろに追加される。

参考:

Module を include するとはどういうことか | さの、ブログやるってよ

instance method Module#include (Ruby 2.6.0)

super

継承チェインを辿って前のメソッド (親のメソッド/祖先のメソッド) を呼び出す。

参考:

Overriding ruby module methods | @darrinholst

prepend

指定したモジュールを self の継承チェインの「先頭に追加する」ことで、既に self で定義されているメソッドを「オーバーライド」する。

一つの prepend メソッドで複数のモジュールを指定した場合、最後の引数から先頭に向かって逆順に処理され、先に記述したモジュールが継承チェインの前に位置することになる。

「オーバーライド」は継承によるものであり、オーバーライドしたインスタンスメソッドから super を呼ぶことで、継承チェインを辿って元のメソッドを呼び出すことができる。

MyModule.prepend Module.new do
  define_method :morning_greeting do
    puts "guten Morgen!"
  end
end

MyModule.singleton_class.prepend Module.new do
  define_method :say do
    puts "Hallelujah!!"
  end
end

参考:

Module#prepend | TECHSCORE

Ruby 2.0 の prepend にブロックを指定する | TECHSCORE BLOG

Module#prepend で継承チェーンを入れ替える | kakakakakku blog

instance method Module#prepend (Ruby 2.6.0)

Ruby の prepend を使った際のメソッド探索について | teratail

Module#prepend with practical example | Masa331 blog

メソッドをオーバーライドする方法

  • クラスを継承する。
  • prepend で継承チェインの手前にモジュールを追加する。
  • alias_method で元のメソッドに別名を付けて入れ替える。
  • DelegateClass を使って元のクラスをラップする。
  • bind でレシーバーを動的に結び付ける。

参考:

Ruby でメソッドを上書き (monkey patch) をする方法を調べてみた | 69log

When monkey patching a method, can you call the overridden method from the new implementation? – Stack Overflow

クラスメソッドを prepend でオーバーライドする

singleton_classprepend を呼び出す。

class BaseModule
  def self.class_method
    ...
  end
end

module ClassMethodsExtension
  def class_method
    ...
  end
end

BaseModule.singleton_class.prepend ClassMethodsExtension

参考:

prepend を使ってクラスメソッドを override する – Qiita

How to use Module.prepend to override class method in Ruby | Sikachu’s Blog

How to prepend classmethods – Stack Overflow

Override module method from another module – Stack Overflow

extend

引数で指定したモジュールのインスタンスメソッドを self の特異メソッドとして追加する。

引数に複数のモジュールを指定した場合、最後の引数から先頭に向かって逆順にextend を行う。

参考:

初心者が必ずつまづくオブジェクトモデルの話 (include, extend を理解する) – Qiita

instance method Object#extend (Ruby 2.6.0)

include / prepend / extend の違い

参考:

いつも忘れる Ruby の include, prepend, extend の意味。そして ActiveSupport::Concern についても。- Qiita

include と prepend と extend の違いと用途 | TASK NOTES

ruby の require / include / extend / 継承 / クラス拡張ミックスインまとめ | A Life on Rails

include、extend、ActiveSupport::Concern ざっくりまとめ – Qiita

Include vs Prepend vs Extend | Bytes.write

append_features

参考:

instance method Module#append_features (Ruby 2.6.0)

prepend_features

参考:

instance method Module#prepend_features (Ruby 2.6.0)

included

参考:

include された時にクラスメソッドとインスタンスメソッドを同時に追加する頻出パターン | TECHSCORE BLOG

instance method Module#included (Ruby 2.6.0)

included (Module) | Ruby リファレンス (ref.xaio.jp)

extend module inside another module – Stack Overflow

prepended

参考:

instance method Module#prepended (Ruby 2.6.0)

prepend されたときにクラスメソッドとインスタンスメソッドを同時に追加するパターン | ttanimichi’s blog

How to prepend classmethods – Stack Overflow

extended

参考:

instance method Module#extended (Ruby 2.6.0)

extended (Module) | Ruby リファレンス (ref.xaio.jp)

get a list of extended modules? – Stack Overflow

ancestors / included_modules

参考:

今更聞けない!  Ruby の継承と mixin の概念を継承リストから学ぶ – Qiita

instance method Module#ancestors (Ruby 2.6.0)

instance method Module#included_modules (Ruby 2.6.0)

instance method Class#superclass (Ruby 2.6.0)

instance method Object#singleton_class (Ruby 2.6.0)

get a list of extended modules? – Stack Overflow

include と define_method を組み合わせて使う方法

参考:

include して使うモジュールの中で define_method する – Qiita

ミックスインを取り除く

参考:

クラスを別物に置き換える – Qiita

既存のメソッドを別物に置き換えてみる – Qiita

undef_method と remove_method の違い – Qiita

instance method Module#undef_method (Ruby 2.6.0)

instance method Module#remove_method (Ruby 2.6.0)

How can I reverse ruby’s include function – Stack Overflow

When to use undef_method, and when to use remove_method? – Stack Overflow

まとめ

参考:

ruby の require / include / extend / 継承 / クラス拡張ミックスインまとめ | A Life on Rails

wrong argument type Class エラー

include を行なった場合に TypeError が発生する。

TypeError: wrong argument type Class (expected Module)

原因

Module ではなく Classinclude しようとした。(Classinclude できない。)

対処法

include の対象が Module であることを確認する。

参考:

Class は include できない | Perler の Ruby 日記

How to include module’s class in controller? | Ruby-Forum

TypeError: wrong argument type Class (expected Module) – Stack Overflow

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です