From: gotoken@... (GOTO Kentaro) Date: 1998-08-19T16:08:18+09:00 Subject: [ruby-list:9214] Re: induced_from ごとけんです In message "[ruby-list:9213] Re: induced_from" on 98/08/19, 石塚圭樹 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