読者です 読者をやめる 読者になる 読者になる

【Ruby】クラスを作るということ

パーフェクトRubyのメタプロの部分を読んでみます。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

書籍の構成は以下のようになっています。

Part3 メタプログラミング
  • 6章 Rubyのクラスオブジェクト
  • 7章 動的なプログラミング
  • 8章 Procオブジェクト
  • 9章 Methodクラス
  • 10章 Rubyでのリフレクションプログラミング

勉強ノートとしてここにまとめていきます。

6-1 Classクラスからクラスを作る

よく見る以下の様なクラスの定義式

class EconomyClass
  #実装
end

内部ではEconomyClassという定数にClassクラスのインスタンスを割り当てる(頭大文字は定数)、ということを行っているらしい。(クラスなんだかインスタンスなんだかややこしい。)
事実、クラスの定義は以下のように書いてもやっていることは同じ。(ローカル変数の挙動が少し異なる。)

BusinessClass = Class.new do
  #実装
end

変数に同様のこと(Classクラスのインスタンスの割り当て)をするとどうなるか?なんてことも書いてある。

not_const = Class.new #=> #<Class:0x007fec9b8712b8>
not_const.name #=> nil

あああ・・・。
ということでクラス名のないクラスの出来上がり。ちなみに以下のコードを実行すると嘘をつかれる。

class not_const
end
$ ruby not_const.rb 
not_const.rb:1: class/module name must be CONSTANT
さらにちなみに

さっきのクラス名のないクラス、早くクラス名をつけて欲しいらしく他の定数に代入しただけでクラス名を得る。そして一度名前を得ると簡単には変えられないらしい。おもしろい!!

not_const = Class.new
p not_const.name #=> nil
IGiveYouTheName = not_const
p not_const.name #=> "IGiveYouTheName"
NewName = not_const
p not_const.name #=> "IGiveYouTheName"