From: Shugo Maeda Date: 2009-07-24T11:07:19+09:00 Subject: [ruby-dev:38894] Re: 多重代入やメソッド引数の展開でto_aが呼ばれます 前田です。 2009/07/15 10:00 に Shugo Maeda さんは書きました: >> なぜそのような変更したのか、ぜんぜん覚えていないんですが(一時 >> 的に to_splat を呼んでたのは覚えてる)、改めて考えてみるとどち >> らも to_ary だけが呼ばれるべきのような気がしています。 開発者会議では上記でよいのではないかという結論でしたが、 > そうすると、以下のコードの挙動が変わりますが、誰も困らないような気もします。 > > defiant:~$ ruby-1_8 -ve 'x = *(1..10); p x' > ruby 1.8.8dev (2009-07-13 revision 24066) [i686-linux] > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] その後上記の挙動が変わると困るという意見が続出しました。 以下のような選択肢があると思いますが、どうでしょうか。 * 現状のままto_aのみを呼ぶ * 1.8と同じようにto_ary, to_aの順にメソッド探索してあったら呼ぶ * to_aryのみを呼ぶようにして、Rangeにto_aryを定義する → RangeはArrayのように振る舞わないのでこれはだめだと思います。 * to_splatを復活させる → 名前が問題ですが、*@という名前のメソッドにするのはどうかという   案がRubyKaigiの時に出ました。 あと、nilだとto_aryもto_aも呼ばないようなのですが、これは意図された 挙動でしょうか。 class NilClass def to_ary [1,2,3] end end x = *nil p x #=> nil 1.8のソースを読む限りは意図的な気がするのですが、どういう意図でしょう? -- Shugo Maeda