これつぐです。


[ruby-dev:8621] Re: Enumerable and rand
>  knuです。

> ・Range#{length,size}は、eachでイテレートしたときに繰り返される
> 回数を計算するようですね。しかし現在の実装では、両端のいずれかが
> FloatのときにはFloatが返ってしまいます。計算結果をfloorした方が
> いいのではないでしょうか。

$ ruby -e 'p ((0.0..1.0).size)'
2

よりも

$ ruby -e 'p ((0.0..1.0).size)'
1.0

の方がいい気もします。
patch は以下でいいのかしら?

# C は(も)よく知らなかったりする。
# 一応私の期待通りには動くみたい。


Index: ruby/range.c
===================================================================
RCS file: /home/cvs/ruby/range.c,v
retrieving revision 1.5
diff -u -r1.5 range.c
--- ruby/range.c	1999/12/07 09:23:27	1.5
+++ ruby/range.c	1999/12/10 13:15:00
@@ -306,7 +306,7 @@
 	return rb_length_by_each(range);
     }
     size = rb_funcall(end, '-', 1, beg);
-    if (!EXCL(range)) {
+    if (!EXCL(range) && TYPE(beg) != T_FLOAT && TYPE(end) != T_FLOAT) {
 	size = rb_funcall(size, '+', 1, INT2FIX(1));
     }