LoginSignup
40
38

More than 5 years have passed since last update.

RubyのClassクラスとかのモヤッと感をズバッと解決したい

Posted at

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で実装、表現したい時にObjectClass として実装(解釈)したのだけども、どうやらそのObjectClass というオブジェクトとクラスの実装(解釈)によるとObjectClass 自体も オブジェクトかつ クラス である事が分かって(考えないといけなくなって)、「ああでは整合性が取れるように、Class のクラスをClass にしよう、けどこれはクラスをClass と解釈した時と文脈が違うのでメタクラス、そしてClassObject もオブジェクトとして考えないと行けないようなので、メタオブジェクトと呼ぼう」(実際にはModule もそう)

これが Object#classClass#class を考えだすと少しモヤッとしてしまう原因なのかなと、こいつらは真にRubyのオブジェクトやクラスなどの解釈の中で生まれたオブジェクトやクラスでない. その解釈を保つためにオブジェクトやクラスとして見なされた、のでメタクラスとメタオブジェクトと呼ぶ事にしよう.

何が言いたいて、オブジェクトやクラスは形而上の言葉で、それ自体のオブジェクトやクラスは思考の範疇でなくて
(神の神とかを考えないのと同じで)

それをRubyなどで具体に落とし込んだときに、生まれてしまったもの. (それをメタクラス、メタオブジェクトと名付けよう)

あえて見通しを良くするためにModule とモジュールも抜きにしましたが、同じ原理が適応出来るかなと思う.

で結局、Class というメタクラスと

ObjectClassModule というメタオブジェクトでRubyの世界は構築出来るよ!てお話しになると、理解するとスッキリする.

BasicObject は生まれた経緯が全く違うので割愛(この考え方では手に負えないし、負う必要もない)

実際は

ここまで適当な妄言をふかして来ましたが、実際Rubyの作者の松本さんが、Rubyのコミュニティがどう考えてきたか(いるか)は存じ上げませんし、この様に考えているとは思いませんが

ふとこいう思考をするとスッキリしたのでここに記しました.

そもそも僕の理解力の問題で、もっと単純明快な理解とか説明があればお教えください
(一番の目的)

gogo.

40
38
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
38