From: Koji Arai Date: 2003-08-06T02:59:09+09:00 Subject: [ruby-list:38031] Re: Array#fill { ... } 新井です。 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 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; ilen; i++) { > + for (i=beg; 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; ilen; i++) { - beg++; - v = rb_yield(LONG2NUM(beg++)); + for (i=beg; ilen; i++) { + v = rb_yield(LONG2NUM(i)); if (i>=RARRAY(ary)->len) break; RARRAY(ary)->ptr[i] = v; } -- 新井康司 (Koji Arai)