ruby-reference-manual:2171
From: 5 5 <redmine@r...>
Date: Mon, 26 Apr 2010 23:08:59 +0900
Subject: [ruby-reference-manual:2171] [Bug #3199] Rational と Integer の denominator, numerator
チケット #3199 が更新されました。 (by 5 5) > # 1.8 だと Rational.new! で作れるので、Rational.new!(6, 4).denominator > # は 4 になりますが、1.9 では使えません。 そうすると,Ruby 1.8 と 1.9 とを分けて考えないといけないのですね。 以下のような理解で正しいでしょうか? ◎Ruby 1.8 * Rational オブジェクトは有理数を表すという目的を持つが,直接的には(2 整数による)分数を表す。 * Rational#== は有理数としての一致ではなく,分子・分母の一致を判定するもの。 * Rational.new! で生成されるオブジェクトは約分されていない。 * したがって,可約な Rational オブジェクトが存在しうる。 * Rational.new! を一度も使わずに可約な Rational オブジェクトを作ることはできない。 * 有理数を表さない Rational オブジェクトが存在しうる(Rational.new!(1, 0) など) * Rational.new! を一度も使わずに,有理数を表さない Rational オブジェクトを作ることはできない。 ◎Ruby 1.9 * 基本は Ruby 1.8 と同じだが,Rational.new! メソッドは存在しない。 * したがって,すべての Rational オブジェクトは有理数を表し,既約である。 * また,Rational#== は有理数としての一致を判定する。 ※ここで,Rational オブジェクト r が既約であるとは,r.numerator と r.denominator が互いに素であることを意味し,可約であるとは既約でないこととします。 以下,上記の理解が正しいとして話を進めます。 ユーザーにとっては,Rational オブジェクトの内部がどうなっていて,denominator, numerator メソッドがどういう仕事をするかはあまり重要ではありません。知りたいのは Rational オブジェクトが何を表していて,これらのメソッドが何を返すのかです。 Ruby 1.9 の仕様では,ユーザーは Rational オブジェクトの内部表現を一切意識しないで使うことができます。numerator, denominator は必ず既約分数表現の分子,分母を返すと言えるのですから,そう書くべきだと思います。 このことが分かっていないと,たとえば r が単位分数であるかを判定するのに r.numerator==1 としてよいかどうかが分かりませんし,r が整数かどうかを判定するのに r.denominator==1 としてよいかどうかが分かりません。 Ruby 1.8 の仕様では,denominator, numerator は有理数の性質ではなく内部表現に依存した値を返すので,そう書くべきだと思います。メソッドのところに書くか,あるいはメソッドの説明には「分子を返す/分母を返す」とのみ記述し,Rational の説明のところに Rational オブジェクトは既約とは限らないという意味のことを記述するのがいいと思います。 ところで,Ruby 1.8 では Rational.new!(0, 1).zero? # => true Rational.new!(0, 2).zero? # => false なんですね。 Rational#zero? のページが無いのはいいのでしょうか? ---------------------------------------- http://redmine.ruby-lang.org/issues/show/3199 ---------------------------------------- http://redmine.ruby-lang.org -- ML: ruby-reference-manual@m... 使い方: http://QuickML.com/
2162 2010-04-25 09:52 [redmine@r... ] [Bug #3199] Rational と Integer の denominator, numerator 2163 2010-04-25 11:33 ┣[redmine@r... ] 2164 2010-04-25 15:18 ┣[redmine@r... ] 2170 2010-04-26 01:51 ┣[redmine@r... ] -> 2171 2010-04-26 16:08 ┣[redmine@r... ] 2173 2010-04-27 15:29 ┣[redmine@r... ] 2175 2010-04-27 17:42 ┣[redmine@r... ] 2195 2010-05-09 09:38 ┗[redmine@r... ]