新井です。

In message "[ruby-list:38030] Re: Array#fill { ... }"
  on 06 Aug 2003 02:25:38 +0900,
  matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです
> 
> In message "[ruby-list:38029] Array#fill { ... }"
>     on 03/08/06, yoshihisa masuda <sacong / mac.com> writes:
> 
> |1.8.0 で Arrary#fill がブロック要素を取るようになったよう
> |ですが、どうにも挙動がおかしいように思います。
> 
> バグです。がーん、1.8.0最悪のバグですね。
> 
> --- array.c	1 Aug 2003 02:52:17 -0000	1.130
> +++ array.c	5 Aug 2003 17:25:29 -0000
> @@ -1572,5 +1572,5 @@ rb_ary_fill(argc, argv, ary)
>  
> -	for (i=0; i<RARRAY(ary)->len; i++) {
> +	for (i=beg; i<len; i++) {
> +	    v = rb_yield(LONG2NUM(beg));
>  	    beg++;
> -	    v = rb_yield(LONG2NUM(beg++));
>  	    if (i>=RARRAY(ary)->len) break;

これだと、

p [1,2,3,4].fill(3,7) {|i| i}
[1, 2, 3, 3, 4, 5, 6, false, false, false]

などとなります。

p [1,2,3,4].fill(3,7) {|i| i}
[1, 2, 3, 3, 4, 5, 6, 7, 8, 9]

p [1,2,3,4].fill(3,7) {|i| "o"*i}
[1, 2, 3, "ooo", "oooo", "ooooo", "oooooo", "ooooooo", "oooooooo", "ooooooooo"]

だと思うのです。


Index: array.c =================================================================== RCS file: /usr/local/cvsup/ruby/ruby/array.c,v retrieving revision 1.130 diff -u -r1.130 array.c --- array.c 1 Aug 2003 02:52:17 -0000 1.130 +++ array.c 5 Aug 2003 17:55:59 -0000 @@ -1570,9 +1570,8 @@ VALUE v; long i; - for (i=0; i<RARRAY(ary)->len; i++) { - beg++; - v = rb_yield(LONG2NUM(beg++)); + for (i=beg; i<RARRAY(ary)->len; i++) { + v = rb_yield(LONG2NUM(i)); if (i>=RARRAY(ary)->len) break; RARRAY(ary)->ptr[i] = v; } -- 新井康司 (Koji Arai)