From: matz@... (Yukihiro Matsumoto) Date: 2003-04-24T17:09:13+09:00 Subject: [ruby-list:37614] Re: 1.8.0 to_ary まつもと ゆきひろです In message "[ruby-list:37613] Re: 1.8.0 to_ary" on 03/04/24, Koji Arai writes: |`*' による配列展開は、多重代入の右辺とメソッド呼び出しの引数 |の二種類ありますが、* の対象が配列でないとき・・・ | | 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] | # | |ということでよろしいでしょうか? そうです。右辺(または呼び出し側)の単項 * はto_aryだけを使い ます。 |また、以下(メソッドの引数がちょっと変わる)が、違う挙動なのは |なんでしょう? | | 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] 「挙動が違う」と言うのはメッセージが違うと言う意味ですか? |上記、多重代入、メソッド引数以外にも配列の最後の要素も * を |置けるようですが、これはメソッドの引数と同じ解釈ですね。 はい。上で述べた通りです。