Class
クラスとかModule
クラスの継承関係やら、
それ自体のクラスとかの関係てなんかモヤっと感あるなあと思っていて、
上手い事キレイに説明したいなと思い色々考えていたらそっぽい答えが出たので書きます.
まあひとまず以下のコード見て頂いてモヤっとしなければこんなクソ記事すぐ閉じるが宜しいかと.
もしモヤっとした方で興味があったらお読み頂ければなと.
'1'.class
=> String
'1'.class.class
=> Class
'1'.class.superclass
=> Object
'1'.class.class.class
=> Class
'1'.class.class.superclass
=> Module
'1'.class.class.superclass.class
=> Class
'1'.class.class.superclass.superclass
=> Object
'1'.class.class.superclass.superclass.class
=> Class
'1'.class.class.superclass.superclass.superclass
=> BasicObject
日本語で書いておくと、
"1"はStringクラスのオブジェクトである
String
クラスはClass
クラスのオブジェクトである
String
クラスはObject
クラスのサブクラスである
Class
クラスはClass
クラスのオブジェクトである
Class
クラスはModule
クラスのサブクラスである
Module
クラスはClass
クラスのオブジェクトである
Module
クラスはObject
クラスのサブクラスである
Object
クラスはClass
クラスのオブジェクトである
Object
クラスはBasicObjectt
クラスのサブクラスである
クラスがゲシュタルト崩壊してきた....
オブジェクトとかクラスはただの哲学用語
カタカナで表せられるオブジェクトとかクラスはまあ哲学用語に近いというか、僕たちの認知の向こう側に埋まっている言葉で、オブジェクト指向というある種の哲学上で用いられる言葉.
だからオブジェクトとかクラスは形而上にあるもので、感性を介しては真に認知出来ないという理解でいます.
まあこの理解自体も僕なりの理解なので人それぞれで良いと思いますが、この記事内ではこの様なものとして扱います.
この話をしだすと長くなりそうなので必要ならばまた別で.
クラスのRuby実装がClass
オブジェクトやクラスは感性を介しては認知出来ませんが、Class
はそのクラスの一つの具体(解釈)で、Ruby内ではその文脈の元、クラスという言葉を使っているんじゃないかと考えるとスッキリ行く気がします.
同様にObject
も先のある種の哲学用語であるオブジェクトのRuby上での実装なのかなと.
メタクラスとメタオブジェクト
僕がこの言葉を知ったのは、Ruby自体のソースコードの解説書であるRubyソースコード完全解説を読んでいた時の事で、
http://www.amazon.co.jp/Ruby%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E/dp/4844317210
この著書内で述べられている事と僕の理解を合わせると、
オブジェクトとかクラスとか非常につかみづらいモノをRubyで実装、表現したい時にObject
やClass
として実装(解釈)したのだけども、どうやらそのObject
やClass
というオブジェクトとクラスの実装(解釈)によるとObject
も Class
自体も オブジェクトかつ クラス である事が分かって(考えないといけなくなって)、「ああでは整合性が取れるように、Class
のクラスをClass
にしよう、けどこれはクラスをClass
と解釈した時と文脈が違うのでメタクラス、そしてClass
とObject
もオブジェクトとして考えないと行けないようなので、メタオブジェクトと呼ぼう」(実際にはModule
もそう)
これが Object#class
や Class#class
を考えだすと少しモヤッとしてしまう原因なのかなと、こいつらは真にRubyのオブジェクトやクラスなどの解釈の中で生まれたオブジェクトやクラスでない. その解釈を保つためにオブジェクトやクラスとして見なされた、のでメタクラスとメタオブジェクトと呼ぶ事にしよう.
何が言いたいて、オブジェクトやクラスは形而上の言葉で、それ自体のオブジェクトやクラスは思考の範疇でなくて
(神の神とかを考えないのと同じで)
それをRubyなどで具体に落とし込んだときに、生まれてしまったもの. (それをメタクラス、メタオブジェクトと名付けよう)
あえて見通しを良くするためにModule
とモジュールも抜きにしましたが、同じ原理が適応出来るかなと思う.
で結局、Class
というメタクラスと
Object
と Class
と Module
というメタオブジェクトでRubyの世界は構築出来るよ!てお話しになると、理解するとスッキリする.
BasicObject
は生まれた経緯が全く違うので割愛(この考え方では手に負えないし、負う必要もない)
実際は
ここまで適当な妄言をふかして来ましたが、実際Rubyの作者の松本さんが、Rubyのコミュニティがどう考えてきたか(いるか)は存じ上げませんし、この様に考えているとは思いませんが
ふとこいう思考をするとスッキリしたのでここに記しました.
そもそも僕の理解力の問題で、もっと単純明快な理解とか説明があればお教えください
(一番の目的)
gogo.