Ruby 特異クラス?無名クラス?シングルトンクラス?extend?singleton_methods?飾らない真実メモ
(_ _) わたくし如きが偉そうに言い切っちゃってすいません
特異クラス?無名クラス?シングルトンクラス?
- 人によって用語が違うんでややこしい
- もともと特異クラスは無名だ
- 「全てのオブジェクトが持っている、Object#singleton_classでアクセスできる彼だけの特異クラス」を「シングルトンクラス」と呼べばいいのに「特異クラス」と言うからややこしくなる
Object#extend(Module) は「指定したmoduleのメソッドをレシーバの特異メソッドとして追加する」
- 正確ではない
- レシーバのシングルトンクラスの直上に(内部処理的な)クラスを挿入しmoduleを取り込む
- レシーバのシングルトンクラスにメソッドを追加するわけではない
- もちろん、レシーバ.singleton_methods(false) には現れない
Module#singletom_methods(false) は 「レシーバの特異メソッドを返す」
- 正確ではない
- レシーバのシングルトンクラスに定義されているメソッドのみを返す
- extendされたモジュールは無視されるので、それらに定義されているメソッドを特異メソッドと呼びたいのであればイメージした結果は返ってこない
Module#singletom_methods(true)
- レシーバのシングルトンクラスのancestors内のメンバに定義されているメソッド達を探索ルートに従って投影的に返す
Module#include(Module)
- レシーバが「私を探索してもインスタンスメソッドは見つからなかったのか、残念だ。スーパークラスを探索するなら、先に探索して欲しいモジュールがあるんだが」と差し出すクラス達を追加する
Module#prepend(Module)
- レシーバが「私のインスタンスメソッドを探索するなら、先に探索して欲しいモジュールがあるんだが」と差し出すモジュールを追加する