2007年12月18日

[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 <naruse@xxxxx>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

投稿者 xml-rpc : 2007年12月18日 14:10
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67758
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。