From: Shin-ichro Hara Date: 1998-11-25T16:43:28+09:00 Subject: [ruby-dev:3667] Re: Multiple assignment at yield() 原です。 In message "[ruby-dev:3663] Re: Multiple assignment at yield()" on 98/11/25, Yukihiro Matsumoto writes: | |まつもと ゆきひろです |ここにいたって *x = a なんか導入しなければ良かったと思ってま |す.実はこれは比較的後で導入されたので. そんなこと言わないでくださいよ。(^^; これはいいですよ。 |一番抵抗が大きい理由は「私が今の動作に納得している(個々のルー |ルの積み上げとして)」という点でしょう. やはり誤解があったみたいです。こちらももう一度説明します。 |もう一度まとめてみましょう.左辺がコンマを含む時の動作は現状 |(A)も原さんの案(B)も同じだとしましょう.モデルとしては厳密に |は違うのですが(強制的な配列化の手順が入る),結果が同じなので |無視することとします. はい、この場合(A)と(B)は*全く*同じです。 |違いがあるのは左辺が *x の場合です. | | *x = 1,2,3 | (A) [1,2,3] | (B) [[1,2,3]] # あれ? [1,2,3]だっけ? いえ、これは [[1,2,3]] ではなく [1,2,3] です。つまりこの場合 も*全く*同じなんです。 | *x = a | (A) a.to_a | (B) [a.to_a] | |(A)の動作は「右辺を配列化し,それを代入」です.(B)の動作は |「右辺を強制的に配列化し,その要素がひとつであれば,to_aした |ものと置き換える」です(よね). これは誤解です。正しくは *x = a (A) a.to_a (B) [a] です。違いはこの一箇所のみです。 なぜまつもとさんが誤解したかというと、私の[ruby-dev:3610]の説明が 読み難かったからですね。なぜこの読み難い説明をしたかというと、ま つもとさんが多重代入はまず to_a が起動されるのだからそれは不可能 であると主張したからで、私は違うモデルを示したかったのです。しか しモデルはともかく、違いはこの一箇所のみです。