振替休日ではあるが、体調の優れない人が数名いたので、 ぐたぐたとして過ごす。
夕方からはさすがにこれではいけないだろうと、 一念発起して近所のボーリング場に出かける。
いや、久しぶりのボーリングはなかなかうまくいかないものだ。 私のスコアは120。もっとも子供用のガーターレールに数回助けられたので、 本当ならもうちょっと(だいぶ?)成績は悪かったはずだ。
インスタンス変数の次はクラス変数。
Rubyのクラス変数(@@fooのようなもの)は、クラス変数という名前ではあるが、 その実体は「一番内側のclass/module文で定義されているクラス(またはモジュール)をスコープとするグローバル変数」である。
だから、クラス定義のボディ部でも、メソッド内部でも、クラスメソッド内部でも、 あるいはそこで定義されている特異メソッド内部でも、とにかくclass文の範囲内では同じ変数が見える。
ここまでは(一度分かってしまえば)問題ない。
現在の仕様ではクラス変数への参照が行われた時、以下の順序で探索が行われる。
しかし、これではクラス変数がどのクラスに属するかすぐにはわからない。 それだけではなく、代入が行われるタイミングによってクラス変数が所属するクラスが変化する可能性さえある。
そこでRuby2ではクラス変数は必ず一番内側のクラスに所属することとし、 スーパークラスへの探索は行わない。 もしサブクラスからクラス変数にアクセスしたい場合にはアクセサを用意することで対応する必要がある。