1. gogotanaka

    Posted

    gogotanaka
Changes in title
+RubyのClassクラスとかのモヤッと感をズバッと解決したい
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,104 @@
+`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.