From: EGUCHI Osamu Date: 1999-08-08T04:17:30+09:00 Subject: [ruby-dev:7558] NaN#<=> えぐち@エスアンドイーです。 以前も話題になった、『NaN との比較の結果をどう扱うか?』 の問題ですが、現状は、、 % ruby -ve 'nan=1.0%0; p nan <=> 1' ruby 1.3.7 (1999-08-06) [i386-freebsd3.2] -1 となります。 Numeric#<=> のマニュアルには、 [> self <=> other [> selfとotherを比較して, selfが大きい時に正,等しい時に0, [> 小さい時に負 の整数を返します. とあるのですが、NaN はこれのいづれにもあたりません。 この挙動が問題になるのは、 例えば Array#sort で暗黙に Number#<=> が参照された時で、 % ruby -ve 'p [1,9,2,1.0%0,8,3,7,4,6,5].sort' ruby 1.3.7 (1999-08-06) [i386-freebsd3.2] [1, NaN, 2, 3, 4, 5, 6, 7, 8, 9] という、妙な結果となります。 一応、NaN の場合は整数でなく false を返す パッチを末尾に付けましたが、この変更で、、 % ./ruby -ve 'p [1,9,2,1.0%0,8,3,7,4,6,5].sort' ruby 1.3.7 (1999-08-06) [i386-freebsd3.2] /var/tmp//rbN23315:1:in `sort': no implicit conversion from boolean (TypeError) from /var/tmp//rbN23315:1 となります。 とりあえず、false を返しましたが、 nil , self(=NaN) あたりにしても、それぞれ理由が付けられそうです。 どんなもんでしょうか? えぐち Index: numeric.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/numeric.c,v retrieving revision 1.1.1.3.2.11 diff -u -d -r1.1.1.3.2.11 numeric.c --- numeric.c 1999/07/15 07:59:48 1.1.1.3.2.11 +++ numeric.c 1999/08/07 13:19:06 @@ -443,7 +443,8 @@ } if (a == b) return INT2FIX(0); if (a > b) return INT2FIX(1); - return INT2FIX(-1); + if (a < b) return INT2FIX(-1); + return Qfalse; } static VALUE