初めてのRuby復習(4)
クラス名と定数(p144)
Durationというクラスの定義式を評価したとき、Rubyは
(1)Durationクラスを表すClassクラスのインスタンスを作成し、
(2)そのインスタンスへの参照を値として、Durationという定数式を初期化します
クラス定義の追加(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ってほんとに楽しいですね。