In article <200307290758.QAA10992.keiju / bc.mbn.or.jp>,
  keiju / ishitsuka.com (石塚圭樹) writes:

> いやー. なんというか(^^;;; newに関しては, Smalltalkからの習慣でnewしか
> ない, Rubyにはこういうことは不可能であると, 思い込んでいたということか
> しら? 解決できる方法があるとは全然思っていませんでした(^^;;

えぇと、Ruby ではオブジェクトを初期化するのが基本的には initialize し
かないので、普通に書くと initialize はやりたいことが全部できるようなプ
リミティブなものになります。

ここで、やりたいことというのはライブラリ内部の要求も含むので、Rational
のように約分しないものや、昔の Date のようにユリウス日で指定するものの
ように、普通のユーザから見ると使用頻度の低いものになりがちです。

ところが、new はもっとも頻繁に使うコンストラクタで、ユーザが普通一番最
初に思いつくものなので、使用頻度の低いものに割り当てておくとユーザの期
待を裏切ることになるわけです。

で、これを回避するには、メタクラスで alias により new を改名するとか、
allocate したのを instance_eval で初期化するとかの方法があるわけですが、
どちらも難しいようです。少なくともそういう方法に自然に誘導されるような
言語設計になってはおらず、どちらかというと、そういうのはかなり不自然で
やりたくないと思うような気がします。

これを解決するには、

* なにか別の言語機構を考えてそういう状況を簡単に回避できるようにする、

* alias とかの方法を idiom として広めて簡単に思いつくようにする、

といったことが考えられて、この記事はなんとなく後者っぽいことをやってい
たりするわけですが、前者の方向でなんかうまいのってないですかねぇ?

たとえば、単なる思いつきですが、Rational の方法を一般化して Class#new!
を initialize! を呼び出すように定義しておく、とか。
-- 
[田中 哲][たなか あきら][Tanaka Akira]