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
参考:
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
クラスメソッドを prepend でオーバーライドする
singleton_class
に prepend
を呼び出す。
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
ミックスインを取り除く
参考:
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
ではなく Class
を include
しようとした。(Class
は include
できない。)
対処法
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