初めてのRuby復習(4)

クラス名と定数(p144)

Durationというクラスの定義式を評価したとき、Ruby
(1)Durationクラスを表すClassクラスのインスタンスを作成し、
(2)そのインスタンスへの参照を値として、Durationという定数式を初期化します

Rubyではクラスもオブジェクトであり、Classクラスのインスタンスということか。

クラス定義の追加(p148)

Rubyのクラスはオープン性を持つ。
これはClass#freezeメソッドで禁止できる。freezeはインスンタスメソッドであるが、上記のとおり、定義したクラスはClassクラスのインスタンスであるため、Duration.freezeのようにメッセージを送ることができる。なるほど。

スーパークラスの呼び出し(p149)

superは呼び出し方によって挙動が変わる。

呼び出し方 挙動
super 現在のメソッドの引数をそのまま引き渡して親クラスの実装を呼び出す
super() 引数を1つも渡さずに親クラスの実装を呼び出す

定数(p153)

定数はクラスに属する変更不能な変数です

定数はクラスに属していて、トップレベルで定義した定数はObjectの定数になるとのこと。

Object::Duration::DAYS_OF_WEEKまでは良いとして、それ以降の意味がよく分からない。例は途中から警告が出るけれど。。。
irb(main):011:0> class Dur
irb(main):012:1>   DAYS=10
irb(main):013:1> end
=> 10
irb(main):014:0> p Dur::DAYS
10
=> nil
irb(main):015:0> p Object::Dur::DAYS
10
=> nil
irb(main):016:0> p ::Object::Dur::DAYS
10
=> nil
irb(main):017:0> p Dur::Object::Dur::DAYS
(irb):17: warning: toplevel constant Object referenced by Dur::Object
10
=> nil

特異メソッドと特異クラス(p154)

メタクラスの話が出てきてややこしいけれど、RubyメタクラスSmalltalkのそれとはちょっと様子が違う印象。
よって意味としてはメタクラスなのだろうけれど、あくまで特定のオブジェクトに属するというのが主題であるので、メタクラスは付随して出てきているのではと思う。Smalltalkメタクラスはメソッド検索の仕掛け上必要なもの。

という理解なのだけれど。

おしまい

ひととおり復習終わり。
いや〜、Rubyってほんとに楽しいですね。