From: Koji Arai Date: 2005-11-15T00:01:59+09:00 Subject: [ruby-dev:27707] Re: Numeric#div 新井です。 In message "[ruby-dev:27706] Re: Numeric#div" on 14 Nov 2005 17:57:56 +0900, Yukihiro Matsumoto wrote: > |いっそのことなくしてしまうというのも選択肢ではないかと? > > なくすって? Numeric#divそのものを? それは避けたいなあ。 話が発散しかけているので整理させてください。 (1) 以下の挙動はバグである。 p -10.div(3) # => -4 p -10.0.div(3) # => -3 これに対して、Numeric#div は、 class Numeric def div(other) self./(other).floor end end という定義であれば良い。 という考えに異論がなければ、1.9 をすぐにでも修正したいと 思います。(要望がないなら、1.8.4は見送り) 以降は、上記が解消した後(修正案を認めてもらった後)に必要であ れば話を進めていただければと思います。 (2) 原さん(の好み)案 「aまたはbがFloatのとき、a.div(b)をa/b、a.mod(b) を0.0とする」 これに関して、 Numeric#div は、レシーバによらず商を整数で返す。 Numeric#quo は、レシーバによらず商を実数で返す。 Numeric#/ は、商をレシーバのクラスに応じたクラスで返す。 (というか、/ は各サブクラスでサブクラスに応じた定義を行う) という仕様があるのだと思っています。今の Ruby で、せっか く整理された現在の仕様を非互換を前提にしてまで変更するこ とはありえない(少なくとも個人の好みでは)と思っています。 まあ、これは原さんも本気ではないのだろうと思います。 (3) 石塚さん案 > >更に新井さんの言うとおり、aまたはbがFloatであるとき、a.div(b) > >とかa.divmod(b)を計算するケースというのはかなり少ないと思います。 > > というか, 下記の例もあるように > > >私の好みでは、「aまたはbがFloatのとき、a.div(b)をa/b、a.mod(b) > >を0.0とする」がいいのですが、まあ、ほとんど賛同を得られないか > >な。(^^; > > どう振る舞うべきかはあまり明確ではないような気がします. > > いっそのことなくしてしまうというのも選択肢ではないかと? 何に対して「どう振る舞うべきか明確でない」といっているかよく わかりませんでした。(aまたはbがFloatのときの div ? divmod も ?) (4) divmod の商は (4.1) Float/Integer のHybrid (4.2) Integer (4.3) Float のいずれが適切か? 現状は、(4.1) なのですが、(4.2) にすれば、Numeric#div の 戻りと完全に一致する((1) のバグは修正したとして)がどうだ ろうか?という話。 これは私が話を出したのではありますが、どうでもいいかなと 思ってます(すみません)。何か ruby-math かどこかで、現状の 挙動をするよう要望があがっていたのを見たように思っていた のですが、探しても見当たらないので気のせいかも知れません。 -- 新井康司 (Koji Arai)