クラスとモジュールの関係性について、あまり知らない人も多くいるのではないでしょうか。
今から、初心者に向けたクラスとモジュールの関係性について解説していきます。
これに関しては、理解していた方が今後スムーズにRubyを使うことができると思うので、是非一読してみてください。
全てのクラスはモジュールである
まず、「全てのクラスはモジュールである」ということについて話していきます。
RubyにClass.superclassという問いをしてみると、Moduleと返ってきます。
つまり、「全てのクラスはモジュールである」と言えます。
初心者のモジュールに対するイメージは、「クラスの中で使える便利なオブジェクト」程度でしょう。
これだと、「クラスの方が上の存在で、モジュールは普段存在しないけど必要な時にだけ現れる便利なツール」のように聞こえる。
でも実はそうではないのです。
全てのクラスはモジュールであって、常にクラスとモジュールは切って離すことができない関係なのです。
普段みんなが定義してるクラスってさ、Classクラスのインスタンスだよ?知ってた?
見出しに関しては先に謝罪しておきますが(すみません笑)、
別に、Classクラスのインスタンスという概念を知らない人を挑発したいわけではなく、この方がちょっと印象的かなと思っただけなんです。。(汗)
という冗談はさておき、皆さんは普段、下記のようにクラスを定義しているはずです。
class ClassA
end
このClassAはインスタンスだということです。
今混乱したでしょう?そうでしょう??
え、舐めてもらっちゃ困るって?そう思った方には素直にすみません。、
えっと、話を戻して、普段皆さんは、インスタンスとはどのようにお考えになっているでしょうか。
多分、初学者の皆様は「クラスから生成される実態のこと」のようなイメージだけ思い浮かべるでしょう。
例えば、クラスは鯛焼き機のことで、インスタンスとは鯛焼きのことである。的な?
そして、普段皆さんが定義しているクラスは、Classクラスのインスタンスなんです。
つまり、Classクラスのインスタンスであるクラスを生成して、クラスのインスタンスを生成するわけです。
しっかり伝えられたでしょうか??
Classクラスとモジュールに深い関係がある
普段皆さんが定義しているクラスはClassクラスのインスタンスだということを話しました。
それは、普段皆さんが定義しているクラスのスーパークラスはClassクラスということになります。
そして、Classクラスのスーパークラスがモジュールになります。
まとめ
どうだったでしょうか??
僕はこのように少し深いところでの繋がりがわかる瞬間がとても大好きで、それを皆さんに共有したいなと思い記事を書かせていただきました。
伝え方の問題でわかりにくいところがありましたら、コメントなどでお知らせいただけましたら修正いたします。
そして、今回の記事をまとめますと、全てのクラスはモジュールであるということと、
皆さんが普段定義しているクラスのスーパークラスはClassクラスであり、Classクラスのスーパークラスがモジュールであるということです。
今後もRubyに関することを中心に、面白いと思ったことを共有いたしますので、よろしくお願いいたします!