blog.waterlow.work

Ruby, Rails, js, etc...

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

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

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

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

書籍の構成は以下のようになっています。 *** Part3 メタプログラミング - 6章 Rubyのクラスオブジェクト - 7章 動的なプログラミング - 8章 Procオブジェクト - 9章 Methodクラス - 10章 Rubyでのリフレクションプログラミング

勉強ノートとしてここにまとめていきます。 *** 6-1 Classクラスからクラスを作る よく見る以下の様なクラスの定義式

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

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

|ruby| not_const = Class.new #=> #<Class:0x007fec9b8712b8> not_const.name #=> nil ||< あああ・・・。 ということでクラス名のないクラスの出来上がり。ちなみに以下のコードを実行すると嘘をつかれる。 |ruby| class not_const end ||< || $ ruby not_const.rb not_const.rb:1: class/module name must be CONSTANT ||< *** さらにちなみに さっきのクラス名のないクラス、早くクラス名をつけて欲しいらしく他の定数に代入しただけでクラス名を得る。そして一度名前を得ると簡単には変えられないらしい。おもしろい!! |ruby| 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" ||<