CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
今回もRubyの不思議を少しだけ垣間見ることにします。
前回の記事では、特異クラス/特異メソッドについて解説しました。
特定のインスタンスだけに機能追加が可能でこれが特異メソッドでした。
特異メソッドの一種という事でクラスメソッドの正体を明かしたのですが、「クラスメソッドはクラス自身の特異クラスにあることになります。」
ここで疑問が湧きます。クラスの特異クラスとは何のことなのでしょう?
操作する対象であるインスタンスが、ある特定のインスタンスだけのためのクラスを持つという概念が特異クラスですが、本来設計図であるはずのクラスがインスタンス同様に特異クラスを持つというのが解せません。
リファレンスマニュアルに因れば、「Rubyでは、クラスもオブジェクトの一つでClassクラスのインスタンスです。」という記載があります。
非常に判りづらいですが、「クラスのクラス」つまりメタクラスとして「Classクラス」が存在するのだそうです。
| class Any; end | any = Any.new | p any.class # => Any | p Any.class # => Class | p String.class # => Class | p Fixnum.class # => Class | p Object.class # => Class
全てのクラスはClassクラスのインスタンスだったのです。
クラス定義をClassクラスのインスタンス化として考えれば、
| p foo = Class.new # => #<Class:0x10ffbc0> | p foo.name # => nil | Foo = foo # 名前のないクラスに定数を指定 | p foo.name # => "Foo" | p foo.class # => Class | foo_obj = Foo.new # Fooクラスのインスタンスを生成 | p foo_obj.class # => Foo
名前のないクラスに定数を指定することでクラス名になるのです。
「Classクラスのインスタンスに定数を割り当てたもの」これがRubyでのクラス定義の仕組みなのです。
メタクラスであるClassクラスにも継承関係が存在します。
| p 10.class # => Fixnum | p Fixnum.class # => Class | p Fixnum.class.superclass # => Module | p Fixnum.class.superclass.superclass # => Object
上記と既存のクラス継承関係を鑑みた図示を試みます。
ちょっと複雑になってしまいました。Rubyを利用する上では直接は関係ないため一度覚えたら忘れてしまったほうが良いかもしれません。
しかし、一見奇妙なこの構造が故に多大な恩恵を受けているのは事実です。気に留めていただきたいのは、クラスは定義であって本来設計図ですから「絵に描いた餅」であるはずですが、Rubyでは設計図すらも「食べられる」ように出来ています。設計図を描いた紙の原料が「お米」であるという喩えになるのかもしれません。
ところで、「ビリー・エリオット」という映画をご存知でしょうか?
「ビリー・エリオット(Billy Elliot)」は、2000年に公開された映画です。
邦題『リトル・ダンサー』として日本でも上映されご存知の方も多いかと思います。英国ではミュージカルとして舞台公演されており、筆者は渡英の際にロンドンで拝見しました(Victoria Palaceにて鑑賞しましたが、劇場が満員で酸欠になって気持ち悪くなってしまいました)。
ブロードウェイでも上演されているようです。もし機会があればどうぞ。
英国北部にある田舎の炭鉱町に不釣合いなバレエに目覚めた少年ビリーが、先生、兄、祖母、そして父親の愛情で、夢を現実へと羽ばたかせます。
オーディションで最後の質問にビリーが返した一言が強烈に残ります。踊っている時に何を感じるのか?という問いに彼がたどたどしく答えます。
「電気が走るみたい。僕の中で電気がはじけて身体中を走ったみたいになる。」
ビリーが成長しプロダンサーとして鳥のように自由に羽ばたくのをラストシーンで見ることが出来ます。何かを好きになる、好きになれるというのは資質、才能でありましょう。彼が踊るようにプログラムを書けるのならさぞかし楽しいことでしょう。思わずそう考えずにはいられませんでした。
次回もお楽しみに。
>> Rubyの関連コース一覧
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes