From: "NARUSE, Yui" Date: 2007-12-18T14:10:53+09:00 Subject: [ruby-list:44360] Re: 配列のシャッフル 成瀬です。 Maehara Masahide (前原正英) wrote: >> 最初,aの要素は,5個あるので,collect は5回実行されると思うので, >> a.slice!(rand(a.length)) を5回繰り返してみました。 > > 以下の私の実行例だと,(*)の部分以下がダウトですね。 > >> ==================================================================== >> irb(main):027:0> a = [1,2,3,4,5] >> => [1, 2, 3, 4, 5] >> irb(main):028:0> a.slice!(rand(a.length)) >> => 4 >> irb(main):029:0> a >> => [1, 2, 3, 5] >> irb(main):030:0> a.slice!(rand(a.length)) >> => 5 >> irb(main):031:0> a >> => [1, 2, 3] >> irb(main):032:0> a.slice!(rand(a.length)) >> => 1 >> irb(main):033:0> a >> => [2, 3] > > (*) > ここの時点で,aの長さが2になっており,collect できない! > 私が最初,勘違いをしたのは,collect は,しだいに減っていく a に対して > 新たに実行されていくものと思っていました。 > このような理解をしたのですが,よろしいでしょうか? たぶんソースを見た方が早いので、 以下に array.c の該当部分のソースを挙げておきました。 static VALUE rb_ary_collect(ary) VALUE ary; { long i; VALUE collect; if (!rb_block_given_p()) { return rb_ary_new4(RARRAY(ary)->len, RARRAY(ary)->ptr); } collect = rb_ary_new2(RARRAY(ary)->len); for (i = 0; i < RARRAY(ary)->len; i++) { rb_ary_push(collect, rb_yield(RARRAY(ary)->ptr[i])); } return collect; } -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA