Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 1 モジュールの特徴
- * モジュールは単体ではインスタンス化できない
- * モジュールは継承できない
- * モジュールはクラスや他のモジュールに取り込むことができる
- # 2 モジュールのメソッド探索経路
- ## 2.1 無名クラス
- ***
- `include`が実行されると、インタプリタは指定されたモジュールに対応する無名クラスを作成して、スーパークラスとの間にそれを組み込む。
- ## 2.2 メソッドの優先度
- ***
- ### 2.2.1 includeの場合
- モジュールとそれをMix-inしたクラスのどちらにも同名のメソッドが存在するとき、2.1節で示したように、`include`したクラスの継承チェーンは、モジュールに対応した無名クラスがスーパークラスとの間に挿入されるので、モジュールのメソッドが優先されると判断しそうだが、実際は継承チェーンに挿入されるだけで、実行順序は変わらない。
- ```ruby
- module M1
- def method1
- puts "module"
- end
- end
- class C1
- def method1
- puts "class"
- end
- end
- p C1.new.method1 #=> "class"
- ```
- ### 2.2.2 prependの場合
- `prepend`も`include`同様にモジュールをクラスに取り込むためのメソッドであるが、`prepend`を呼び出したクラスよりも先にモジュールに対してメソッド検索を行う。したがって同名のメソッドが存在する場合、振る舞いが`include`とは異なる。
- # 3 特異クラス
- ## 3.1 特異クラスの定義
- ***
- ```ruby
- def <オブジェクト名>.<新たに定義するメソッド名>
- ...
- end
- ```
- ## 3.2 特異クラスの参照と再オープン
- ***
- 特異クラスを再オープンするには以下の公文を使用する。
- ```ruby
- class << 対象のオブジェクト
- ```
- ```ruby
- foo = Foo.new(1)
- singleton_class = class << foo
- self
- end
- p singleton_class #=> <Class:#0xnnnnnnn>
- ```
Add Comment
Please, Sign In to add comment