From: SASADA Koichi Date: 2007-04-27T01:30:13+09:00 Subject: [ruby-dev:30738] Re: Ruby 1.9: multiple splats on rvalues in parallel assignment  ささだです.  多分,対応できたと思います.あとでコミットしておきます. Yukihiro Matsumoto wrote: > 入ってないですねえ。 > > a = [1,2,3,4,5] > [*[1,2],3,4,5] == a > [1,2,3,*[4,5]] == a > [*[1,2],3,*[4,5]] == a > [*[1,2,3,4,5]] == a > [*[1,2,3],*[4,5]] == a > > くらいが通れば大丈夫なんでないでしょうか。 >  foo(a, *b, *c) (引数)や x, y, z = a, *b, *c (多重代入)は,それぞれ 特別な処理をしているので,それだけでは足りません.それぞれのテストが必要 になります.  x, y, z = a, b, *c は,x, y = a, b; z = *c のように,かなり親切にコン パイルしていたんですが,こういう多重代入が出てくるともう大変なので,x, y, z = *[a, *b, *c] のようにコンパイルするようにしました. 例: a, b, c, d = *[1], 2, *[3], 4 #=> Ruby で書くとこんな感じ: a, b, c, d = [1].to_splat.concat([2]).concat([3]).concat([4]) コンパイル結果: 0002 duparray [1] 0004 splatarray false 0006 putobject 2 0008 newarray 1 0010 concatarray 0011 duparray [3] 0013 concatarray 0014 putobject 4 0016 newarray 1 0018 concatarray 0019 expandarray 4, 0 0022 setlocal d 0024 setlocal c 0026 setlocal b 0028 setlocal a  いかにも重そうな処理をやっていますが(matzruby と同じくらいのコストか な?),まぁ,多重代入で性能が変わるとも思えないので,こんなところでいい かな,と. -- // SASADA Koichi at atdot dot net