This commit is contained in:
Rikuoh Tsujitani 2024-03-28 22:15:33 +09:00
parent dcdc61b8bd
commit 2acf6b9c94
Signed by: riq0h
GPG key ID: 010F09DEA298C717

View file

@ -270,12 +270,27 @@ extendモジュール内のメソッドをそのクラスの特異メソッ
例題を通して:リファクタリングの一部を先に実践できたところにほのかな成長を感じた
include_modulesincludeされているモジュールの配列が返る
ancestorsモジュールのみならずスーパークラスの情報も返る
333ページから
## 3/28
Enumerableモジュール配列やハッシュ、範囲など、何かしらの繰り返し処理ができるクラスにincludeされているモジュール。map、select、find、countなどのメソッドが定義されている。eachメソッドを実装していれば使えるようになる
Comparableモジュール比較演算を可能にするモジュール。include先のクラスで<=>演算子を実装すると使用可能になる。
Kernelモジュールの秘密ObjectクラスがKernelモジュールをincludeしているのでどこでも使える
トップレベルクラス構文やモジュール構文に囲まれていない一番外側をトップレベルと言う。ここではmainという名のObjectクラスのインスタンスがselfとして存在している
クラス以外のオブジェクトにextendするこの場合、モジュールのメソッドはextendしたオブジェクトの特異メソッドになる
トップレベルにメソッドを定義するとObjectクラスに定義される。つまりトップレベルに定義したメソッドは事実上のグローバルメソッドになる
名前空間としてのモジュール:モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるので、同名のクラスがあっても名前の衝突は発生しなくなる
入れ子なしで名前空間付きのクラスを定義する:名前空間として使うモジュールがすでにどこかに定義されている場合は、モジュール構文やクラス構文を入れ子にしなくてもモジュール名::クラス名のような形でクラスを定義することもできます
クラスの探索Rubyではクラスやモジュールの入れ子関係を順に外側に向かってクラスを探索する
モジュールに特異メソッドを定義する:モジュール単体でそのメソッドを呼び出したい時、モジュール自身に特異メソッドを定義すれば直接モジュール名.メソッド名の形式でメソッドを呼び出すことができる
module_functionメソッドモジュールではミックスインとしてもモジュールの特異メソッドとしても使えるメソッドをこれで定義できる
↑module_functionメソッドを引数なしで呼び出した場合は、そこから下に定義されたメソッドがすべてモジュール関数になる
Mathモジュールに定義されている定数自然対数の底を表すMath::Eと円周率を表すMath::PIがそれぞれ定義されている
シングルトンパターン:アプリケーション内で唯一のオブジェクトを作る手法のことをシングルトンパターンと呼ぶ
メソッドが探索される順番直近のクラス➜内部のモジュール➜スーパークラス➜Objectクラス➜Kernalモジュール➜BasicObject
prependinclude以外の方法でメソッドをミックスインする方法。同名のメソッドがあったときにミックスインしたクラスよりも先にモジュールのメソッドが呼ばれる
refinements独自のスコープを設定できる。有効にするにはusingというメソッドを使う。通常はクラス構文とモジュール構文の内部で使う。トップレベルでも使用できるが、有効範囲はusingが呼び出された場所からファイルの最後までになる
二重コロンとドットの違い:名前空間を区切ったり定数を参照したりするときは二重コロンを使い、メソッドを呼び出す場合はドットを使うのが典型的な使い分け。ただしメソッドの呼び出しに関しては二重コロンも使おうと思えば使える。逆はできない
366ページから