From: matz@... (Yukihiro Matsumoto) Date: 1998-11-18T15:58:00+09:00 Subject: [ruby-dev:3595] Re: Multiple assignment at yield() まつもと ゆきひろです In message "[ruby-dev:3594] Re: Multiple assignment at yield()" on 98/11/18, Shin-ichro Hara writes: |原です。 |実引数から仮引数の値の引渡しは、たとえ1つでも多重代入の様に行 |なわれるわけですね。 | |#そして、単純代入は多重代入の特別な場合であると考えてはいけない |#というのも重要なポイントだ。 ですね. |一応、私の意見としては、 | | *a = [0] #=> a == [[0]] | yield(*[0]) #=> yield(0) | |で一票かな。難しいなあ。 まず,現状を検討したところ, yield(*[0]) # => 0 a = [0] yield(*a) # => [0] でした.これはまずいんで,両方とも 0 を yield するように変更 します.それから | *a = [0] #=> a == [[0]] を考えると,現状の多重代入の動作は (1) 右辺が配列ならそのまま,そうでなければ配列化 (2) 先頭に * が付いた変数には代入しなかった残りが配列とし て代入される となっています.で,原さんの案はどうも1を変更しようというも ののように聞こえます.つまり,配列であるなしにかかわらず,右 辺の式がひとつだったら配列化しよう(配列でくくろう)と. ところが,1はこれはこれで便利なのです.たとえばこのおかげで 配列を返すメソッドを複数の値を返すメソッドとして使えます. 互換性の点だけでなく,使い勝手の点からも1をあきらめるのはつ らいと思います. |これらの実行結果について即答できる人は多くはないと思うけど(^^;、 上記の変更を施したruby 1.1dの挙動は以下の通りです. 1 1 1 1 1 [2] 2 2 2 2 ちょっとは変じゃなくなった? |まあ、ruby1.1 で最適な each の定義は上の each0 ですが、一見正し |そうに見える each3 がうまく動かないのが不満だったわけです。 |(意外に each4 がちゃんと動くのだった。) each4がちゃんと動くのは偶然のような気がしますが…. ||| x = 25 #=> x == 25 ||| x = 25, 26 #=> x == [25, 26] ||| x = *[25, 26] #=> x == [25, 26] ||| |||たいしてうれしくないかもしれないですが、ブロックパラメータの値 |||の受け渡しと consistent になって、八方丸く収まるというわけ。 || ||いや,文法が悲鳴を上げると言うデメリットがあります.^^;;; | |まつもとさんの悲鳴はともかく文法の悲鳴は聞きたくないです。:-) でしょう? たとえば x = 25, 26 を許すと,foo(a=25, 26) が構文解析できなくなるんですね.いや, yaccに悲鳴を上げさせればなんとかならないことはないのでしょう けど,そういう曖昧な文法はイヤなんです. まつもと ゆきひろ /:|)