From: Koji Arai Date: 2003-04-24T03:16:07+09:00 Subject: [ruby-list:37613] Re: 1.8.0 to_ary 新井です。 In message "[ruby-list:37612] Re: 1.8.0 to_ary" on 23 Apr 2003 07:40:06 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > > In message "[ruby-list:37611] Re: 1.8.0 to_ary" > on 03/04/23, Koji Arai writes: > > |* で、to_a を持つオブジェクトはそれが呼ばれるように変わった > |んですかね?よくわかってないのですが、 > | > |あっだから、Object#to_a がなくなる? > > そうです。今は Object#to_a があるんで変なことしてますが、な > くなってしまえば単純な実装になると思います(eval.c 2663行目)。 > マニュアルに反映させようと思ったのですが、少し整理させてください。 `*' による配列展開は、多重代入の右辺とメソッド呼び出しの引数 の二種類ありますが、* の対象が配列でないとき・・・ o 多重代入の右辺においては、to_ary だけでなく、to_a も配列展開の ための配列化に利用されるようになった(ただし、Object#to_a は対象外)。 class Foo def to_a [1,2,3] end end a,b,c = *Foo.new p [a,b,c] => ruby 1.6.8 (2002-12-24) [i586-linux] [#, nil, nil] => ruby 1.8.0 (2003-04-11) [i586-linux] [1, 2, 3] o メソッドの引数においては、to_a は利用されなくなり、 to_ary だけが利用されるようになった。 class Bar def to_a [1,2,3] end end p(*Bar.new) => ruby 1.6.8 (2002-12-24) [i586-linux] 1 2 3 => ruby 1.8.0 (2003-04-11) [i586-linux] # ということでよろしいでしょうか? また、以下(メソッドの引数がちょっと変わる)が、違う挙動なのは なんでしょう? class Bar def to_a [1,2,3] end end p(1,*Bar.new) => -:6: failed to convert Bar into Array (TypeError) ruby 1.6.8 (2002-12-24) [i586-linux] => -:6: cannot convert Bar into Array (TypeError) ruby 1.8.0 (2003-04-11) [i586-linux] 上記、多重代入、メソッド引数以外にも配列の最後の要素も * を 置けるようですが、これはメソッドの引数と同じ解釈ですね。 class Bar def to_a [1,2,3,4] end end p [*Bar.new] => ruby 1.6.8 (2002-12-24) [i586-linux] [1, 2, 3, 4] => ruby 1.8.0 (2003-04-11) [i586-linux] [#] -- 新井康司 (Koji Arai)