ごとけんです
In message "[ruby-list:9213] Re: induced_from"
on 98/08/19, 石塚圭樹 <keiju / Rational.Com> writes:
>けいじゅ@日本ラショナルソフトウェアです.
>prec本体を各クラスで定義するって方がわかりやすいと思います.
賛成です。
# てゆーか、ほぼ同じものを書いてたとこです ^^;
>>でも精度を特徴付けるモジュールはありそうだし、あった方が
>>クラスのインターフェイスの指針が解りよいと思うのですが。
>
>私はそういう考え方は好きです.
ですよね ^^;;
>Ruby標準で:
>
>class Numeric
> include Precision
>
> def prec(klass)
> case klass
> when Integer
> to_i
> when Float
> to_f
> else
> super
> end
> end
>end
to_i, to_f は klass.induced_from(klass) のほうが
好ましくおもいます。 to_i, to_f は一般には無くても良い
と思うので(後述)。
あ、考えて見れば Numeric には chr, upto, downto, divmod
という Complex には似つかわしくないのもあるんですね。
(なんか upto は健気に Complex でも動くけど)
これらも Integer だけにして、 Numeric からは外して
もらいたいなぁ。
>としておけば, あとは, Matrix/Vector/Complexだけの対応で済みますね.
ですね。とりあえず mathn.rb あたりに上記を読むような
ことを書かれると良さそうですね。
>あと, ちょっと危険ですが:
>
>module Precision
> def prec(klass)
> case klass
> when Integer
> to_i
> when Float
> to_f
> else
> klass.induced_from(self)
> end
> end
>
> def prec_i
> prec(Integer)
> end
>
> def prec_f
> prec(Float)
> end
>end
>
>でも良さそう.
どちらかというとこれには不賛成ですが、それはさておき
when Integer は when Fixnum, Bignum でしょうか??
case type_of?(klass) ではサブクラスも拾うので
決められない(それでも良いのかなぁ)し、やや面倒ですね。
>このばあい, Integer/Floatへの変換の時to_i, to_fでまずい場合はそのクラ
>スで対応しなくてはなりませんが. このぐらいのデフォルトの動作は許しても
>良いかも.
不賛成の理由は僕の見方では、String のは別にしても
to_i と to_f はやっぱり、Float, Integer(とその子孫)
固有のメソッドのような気がしてまして、
つまり、Numeric は一般には精度を担っていないという
気分があるんです(反例:Complex)。
んが、実装の取り込みのためにこの Module を使うのは
やぶさかではないと思う変態折衷主義者でもあります ^^;;;
だから特別なこれらのケースに関してはこれらのクラスで
対処するように、最初にあげられた案に加えて
module Precision
def prec(klass)
klass.induced_from(self)
end
def prec_i
prec(Integer)
end
def prec_f
prec(Float)
end
def Integer.induced_from(n); n.to_i; end
def Fixnum.induced_from(n); n.to_i; end
def Bignum.induced_from(n); n.to_i; end
def Float.induced_from(n); n.to_f; end
end
とし、
>class Numeric
> include Presision
^c (^^;;
>end
>
>の追加とMatrix/Vector/Complexだけの対応で済みますね.
と済ませる方が好みですが、効率は石塚さんの危険という案の
方が良さそうですね。どう思われますか??
-- gotoken