急に寒くなる。と思ったらどうやら具合が悪くなってるらしく、 悪寒がしているらしい。
午後からは娘たちの校内音楽会。前述の通り、具合が悪いので私は前半はパス。 娘の登場する後半だけ聞きに行く。まあ、けっこう頑張っているのではないだろうか。 私は子供時代、音楽(特に楽器演奏)が得意ではなかったので、よけい評価が甘くなりがちだ。
なかなか引っ越しについて話も進まないし、 これではいつになったら犬が飼えるかわからないぞ、 ということで、 当面引っ越しせずにハムスターを飼おう、と決める。
子供たちが気に入ったのはロボロフスキーという種類のハムスターなのだが、 あまりに素早いので気軽にかわいがれないだろう、ということで、 パールホワイト種のものを購入。
名前はパールホワイトだから「パール」だそうだ。Rubyじゃないのね。
昨日のローカル変数に続いてインスタンス変数について。
Rebecca Wirfs-Brook女史*1によると、 クラスのユーザには三種類あるそうだ。
これはC++のprivate/protected/publicに相当する。私がC++のデザインでもっとも優れていると思う点だ。
ところがRubyのインスタンス変数は、
ため、 アクセスに「自分自身かサブクラス」と「他人」の二種類のレベルしかない。 当初目指していた「単純さ」という点からはこの素直なデザインは良い面も多いが、 問題もある。
サブクラスからすべてのインスタンス変数が見えるということは、 継承関係があるものからは実装を隠蔽することができないということだ。
このことはまだいい。サブクラスから状態を操作するためのprivateメソッドを用意することで対応できるから。 しかし、インスタンス変数名がうっかり衝突した場合は対応不能だ。悲劇としかいいようがない。 特にモジュールはどのようなクラスにMix-inされるかわからないので、 うかつな名前のインスタンス変数は使えない。
それもこれもインスタンス変数にprotected相当しかないことが問題だ。 privateなインスタンス変数があれば問題は解決するのだ。
ということで、Ruby2ではprivateなインスタンス変数を導入しようと思う。 これから考えなければならないのは、文法をどうするか。
現在との互換性を重視するならば、
というのが考えられるだろう。しかし、インスタンス変数は原則privateであった方が問題が少ない、 という観点からは、その逆、つまり
の方が良いのかもしれない。もうちょっと考える余地がある。
*1 私、個人的にWirfs-Brook女史のファンで、昨年のOOPSLAで出会った時にはサインもらっちゃいました