From: Shin-ichiro HARA Date: 2008-02-19T00:49:49+09:00 Subject: [ruby-dev:33846] Re: rational, complex and mathn 原です。 Tadayoshi Funaba さんは書きました: > Rational() と Rational.new の違いは、Rational() は変換器で、 > Rational.new は基礎的なコンストラクタということだと思います。原さんの > rational からもそういう印象を受けるので、基本的に考えていることは同じ > だと思うのですが。 同じです。 >> Rational を内部で使うライブラリで、mathn.rb を include すると、答えは >> 正しいが、処理速度がかなり遅くなるものがあります。そここで、Unify の影 >> 響を受けない有理数の生成が欲しいと思ったのです。 > > しかし、mathn すると無駄な有理数を排除することになるので、ある場面では > 有利になりますよね。組みこみにして、数値系としての連携を強化し、リテラ > ルを用意したら、だいぶ違ってくると思います。 なるほど。かえって早くなることもあるか…。ちょっと実験してみます。 >> しかし、Rational.new(1, 1) の結果が Rational でなくて、Integer になる >> のは気持ち悪い気がしません?new は private のままがいいかなあ。 > > その感覚はわかりますが、たとえば、Common lisp では、1/1 はリテラルです > が、1 になります。複素数の #c(1 0) も 1 になります。new に固有の課題で > はなく、Rational() や Rational.convert も「変換」しないといけないわけ > ですから、Integer が返るのは変である、といえるかもしれません。 Rational() は「有理数化」なのでいいんです。整数は有理数だから。 Rational.new の Rational はクラスだから、Integer を返されると違和感ある んですよ。 でも、速さを気にするクリティカルなプログラムだったらそもそも mathn をイ ンクルードするな、ということでいいかな。