From: Shin-ichro Hara Date: 1998-12-07T23:54:24+09:00 Subject: [ruby-dev:3759] Re: List() 原です。 In message "[ruby-dev:3756] Re: List()" on 98/12/07, MAEDA Shugo writes: | |前田です |def foo | return 1, 2 |end |*a = foo |p a #=> [1, 2](Array) |a = foo #=> AssignmentError: invalid multiple assignment | |のように、単純代入の右辺がListのインスタンスだったらエラーにする |というのはどうでしょう。 それはありだと思います。 |今でも、 | |a = 1, 2 | |はエラーになるので、その方が自然だと思います。 そうですね。それが根拠になります。しかし return の方は Runtime な エラーですよね。 私は[ruby-dev:3757] での原案の様にブロックパラメータの様に 受けるのも一つの方法かと思います。つまり def foo return 1, 2 end *a = foo p a #=> [1, 2] a = foo p a #=> [1, 2] def foo return [1, 2] end *a = foo p a #=> [[1, 2]] a = foo p a #=> [1, 2] です。これは次の原案の多重代入の仕様の変更も伴っての話ですが: r = [1, 2] の時、*a = r #=> a = [[1,2]] とする 話は多重代入に戻りますが、この考えのもう一つの利点は、「この仕 様変更に伴うスクリプトの書き換えは自動的にできる」というもので す。書き換えるべき場所は「静的」(言葉使いが変かな?)に決まっ てしまうからです。具体的には *a = foo が出てきたら *tmp = foo a = if tmp.size == 1 tmp[0].to_a else tmp end にすればいいわけです。他は一切書き換える必要はない。