From: matz@... (Yukihiro Matsumoto) Date: 1998-11-25T17:34:59+09:00 Subject: [ruby-dev:3668] Re: Multiple assignment at yield() まつもと ゆきひろです In message "[ruby-dev:3667] Re: Multiple assignment at yield()" on 98/11/25, Shin-ichro Hara writes: |原です。 || *x = a || (A) a.to_a || (B) [a.to_a] || ||(A)の動作は「右辺を配列化し,それを代入」です.(B)の動作は ||「右辺を強制的に配列化し,その要素がひとつであれば,to_aした ||ものと置き換える」です(よね). | |これは誤解です。正しくは | | *x = a | (A) a.to_a | (B) [a] | |です。違いはこの一箇所のみです。 あ,なる.to_a化は左辺がリストの時にしか発生しないんですね. ちょっと理解が進みました. で,実装を考えてて困ったのが,右辺の展開が左辺の状態によって 変化する点です.現状の仕様だと多重代入の右辺は「いつもto_aに よって配列化する」という動作で配列が渡ります.ところが原案だ と左辺がコンマを含むかどうかで展開方法が変化するんですよね. 現在の実装だと右辺の処理と左辺の処理はまったく別のところで行 われていますから,実装としては原案は不都合なわけです.毎回強 制的な配列化を行い,左辺の処理に任せるという実装も考えられま すが,それだと多くの場合無駄な配列を生成することになり,効率 上あまり望ましくありません. それと,[ruby-list:3625]の問題は本質的にはcallやyieldの引数 が複数与えられた時には(強制的な)配列化を行う定義になっており, yield a, b と yield [a, b] の区別が付かないことにあります.というか前者は後者の略記法の つもりだった.これはProc#callにも適用されますから,(少なくと も現状では)callでも両者の区別はつきません.[ruby-list:3625] はその区別を求めているわけですから,多重代入をどうこうするだ けでは不十分で,yieldの実行モデルを再検討しないと解決できな いのです. まつもと ゆきひろ /:|)