はじめに
今回は「クラスについて理解の深掘り」というタイトルで書いていきます
前回の記事
の最後でも書きましたが、学習中にかなり困惑した
「クラスとモジュールもインスタンス」
についての内容となっています!
今回は特に「クラスがインスタンス」であることについて書いており、モジュールやその他の細かい内容は次回の「④Rubyを構成している三大クラス」で書きます
「Ruby3.2リファレンスマニュアルのClassクラス」より抜粋
(class Class は)
クラスのクラスです。
クラスはClassクラスのインスタンス
上記リファレンスにも明記されている通り、普段何気無く使っていたクラスはClassクラスと言うクラスのインスタンスです!
確かに、そうでなければ「rubyは全てがオブジェクト(インスタンス)」とは言えないとは思っていました
最初は
・クラスは設計図
・インスタンスはクラスからできた実体
と言う認識しか持っておらず、全く理解できませんでした
以下、理解する上で私なりに腹落ちした解釈です、、、、、
・Classクラスは「設計図を作る為の設計図」
👇(インスタンス化)
・クラスは「設計図を作る為の設計図」からできた「設計図」
👇(インスタンス化)
・インスタンスは「設計図」からできた実体
と言う認識をした上で
クラスは
1.インスタンスを作る為の「設計図」としての側面
2.Classクラスという「設計図を作る為の設計図」からできた実体としての「設計図」の側面
の『二面性を持っている』と解釈の拡大をして、ようやく理解できました。
改めて、自分が泥沼にハマっていた理由は
「クラスはインスタンスを作る設計図」
つまり
「AはB」
だと思い込んでいた為です。
実は「AはBであり、Cでもある」という可能性を完全に排除していた為でした
また先ほど書いた以下の図で
・Classクラスは「設計図を作る為の設計図」
👇(インスタンス化)
・クラスは「設計図を作る為の設計図」からできた「設計図」
👇(インスタンス化)
・インスタンスは「設計図」からできた実体 ⏪これです
これの最後にできるインスタンスからは、インスタンスを作成できないことも「クラスに二面性」があることの理解を難しくしていました。
「じゃあ、Classクラスは誰が作っているの???」
クラスをClassクラスが作っていることを理解した後に私が感じた疑問です
かなり大雑把な例えになるんですが、
「この世界はどうやってできたのか?」
👇
「神様が作った」
👇
「神様は誰が作ったのか?」
👇
「神様の神様が作った」
👇
「神様の神様は誰が作ったのか?」
👇
以下無限ループ
こんな感じで、「設計図」があり、「設計図を作る為の設計図」があるということは「設計図を作る為の設計図を作る為の設計図」があるはずでは?と思った次第です!
検証する為にclassメソッドでどのクラスに属するのか試してみました
class Sample
end
puts "#{Sample.class}" #=>Class
puts "#{Class.class}" #=>Class
結果として、やはり自分で作ったSmpleクラスはClassクラスに属しているとでます。
しかし、ClassクラスもClassクラスに属しているとでます。
つまり、先ほどのような無限ループが起こらないようにClassクラスで循環が起きているのだと思われます。
ここについては、今後また勉強していきたいと思います
まとめ
今まで使っていたクラスは実は「インスタンスを作成できる」「Classクラスのインスタンス」の二面性を持っていた!
参考にしたサイト
・Ruby3.2リファレンスマニュアル>ライブラリ一覧>組み込みライブラリ>Classクラス