«前の日記(2003年11月21日) 最新 次の日記(2003年11月23日)» 編集

Matzにっき


2003年11月22日 [長年日記]

_ [家族]校内音楽会

急に寒くなる。と思ったらどうやら具合が悪くなってるらしく、 悪寒がしているらしい。

午後からは娘たちの校内音楽会。前述の通り、具合が悪いので私は前半はパス。 娘の登場する後半だけ聞きに行く。まあ、けっこう頑張っているのではないだろうか。 私は子供時代、音楽(特に楽器演奏)が得意ではなかったので、よけい評価が甘くなりがちだ。

_ [家族]ペット

なかなか引っ越しについて話も進まないし、 これではいつになったら犬が飼えるかわからないぞ、 ということで、 当面引っ越しせずにハムスターを飼おう、と決める。

子供たちが気に入ったのはロボロフスキーという種類のハムスターなのだが、 あまりに素早いので気軽にかわいがれないだろう、ということで、 パールホワイト種のものを購入。

名前はパールホワイトだから「パール」だそうだ。Rubyじゃないのね。

_ [Ruby]インスタンス変数

昨日のローカル変数に続いてインスタンス変数について。

Rebecca Wirfs-Brook女史*1によると、 クラスのユーザには三種類あるそうだ。

  • 自分自身
  • サブクラス
  • 他人

これはC++のprivate/protected/publicに相当する。私がC++のデザインでもっとも優れていると思う点だ。

ところがRubyのインスタンス変数は、

  • どのクラスのメソッドからも同じスコープで見える
  • 外からは参照できない

ため、 アクセスに「自分自身かサブクラス」と「他人」の二種類のレベルしかない。 当初目指していた「単純さ」という点からはこの素直なデザインは良い面も多いが、 問題もある。

サブクラスからすべてのインスタンス変数が見えるということは、 継承関係があるものからは実装を隠蔽することができないということだ。

このことはまだいい。サブクラスから状態を操作するためのprivateメソッドを用意することで対応できるから。 しかし、インスタンス変数名がうっかり衝突した場合は対応不能だ。悲劇としかいいようがない。 特にモジュールはどのようなクラスにMix-inされるかわからないので、 うかつな名前のインスタンス変数は使えない。

それもこれもインスタンス変数にprotected相当しかないことが問題だ。 privateなインスタンス変数があれば問題は解決するのだ。

ということで、Ruby2ではprivateなインスタンス変数を導入しようと思う。 これから考えなければならないのは、文法をどうするか。

現在との互換性を重視するならば、

  • @fooで普通の(protectedな)インスタンス変数
  • @_fooでprivateなインスタンス変数

というのが考えられるだろう。しかし、インスタンス変数は原則privateであった方が問題が少ない、 という観点からは、その逆、つまり

  • @_fooで従来の(protectedな)インスタンス変数
  • @fooでprivateなインスタンス変数

の方が良いのかもしれない。もうちょっと考える余地がある。

*1  私、個人的にWirfs-Brook女史のファンで、昨年のOOPSLAで出会った時にはサインもらっちゃいました


«前の日記(2003年11月21日) 最新 次の日記(2003年11月23日)» 編集