トップ «前の日記(2003-11-18 (Tue)) 最新 次の日記(2003-11-20 (Thu))» 編集   RSS 1.0 FEED  

Journal InTime


2003-11-19 (Wed) [長年日記]

_ self.foo = x

Rubyでprivateなsetterを

self.foo = x

のように、selfを指定して呼び出せるようにしたらどうか、と提案しようと思って、 念のため確認してみたらRuby 1.8ではできるようになっていた。

Thu Feb 20 04:07:06 2003  Nobuyoshi Nakada  <nobu.nokada@softhome.net>

	* parse.y (attrset): "self.foo=x" can be legal even when "foo="
	  is private.

負けた…。

その後、IRCでsetter以外のprivateメソッドでもself.fooという書き方を許した方が よいのでは、という話題に。

個人的には、Rubyを覚えたころに、

  • privateメソッドはレシーバを指定して呼び出せない。
  • 関数風のメソッドはprivateメソッドで提供する。

という仕様に非常に感銘を受けたので何となく抵抗があるけど、上記のような仕様の方が 驚きは少ないかもしれない。

_ homogeneous/heterogeneous

GJのようにtype parameterをSystem.Objectに変換するものをhomogeneous、 C++みたいにtype parameterごとに別々の型をインスタンス化するものをheterogeneousと 呼ぶらしい。

もともとparameterrized typeがなかった言語に追加する場合には、homogeneousの方が ライブラリの互換性の面から好ましいようだ。 とすると、C#にはhomogeneousなparameterrized typeが導入されるのかなあ。 (ん…、Visual C++はどうしてるんだろう。)

_ signatureとsupertyping

GNU C++の拡張にsignatureという機能がある。

<URL:http://www.sra.co.jp/wingnut/gcc/gcc-j.html#C++%20Signatures>

signatureの利点を上記URLから抜粋:

2. シグネチャを使うと、既存のクラス階層をシグネチャ型の実装と
   して使うことができる。もしこのクラス階層がコンパイルされた
   形でしか利用できないとすると、抽象仮想クラスを使うときに困
   ることになる。抽象仮想クラスは既存のクラス階層の一番上に後
   から取り付けることはできないからである。このため、インター
   フェースクラスをその抽象仮想クラスの下位型として書く必要が
   ある。

Satherの場合は、「抽象仮想クラスは既存のクラス階層の一番上に後から取り付けること」 ができるようになっている。それがsupertypingだ。

abstract class $FLT > FLT, FLTD is
  flt: FLT;
end;

のように定義することで、新しく作成した$FLTを既存のクラスFLT・FLTDのsupertype にすることができる。

babel(いーかげんちゃんと名前を考えなきゃ)ではどうやって実装しよう…。 既存のクラスをsupertype化する時は、アダプタになるクラスを自動生成するようにして、 必要になった時にアダプタを生成すればすればいいかな(boxingみたいに)。

_ parameterrized

parameterrizedじゃなくてparameterizedだった。 馬鹿丸出し。