From: Shin-ichro Hara Date: 1998-11-18T18:46:56+09:00 Subject: [ruby-dev:3596] Re: Multiple assignment at yield() 原です。 In message "[ruby-dev:3595] Re: Multiple assignment at yield()" on 98/11/18, Yukihiro Matsumoto writes: | |まつもと ゆきひろです |まず,現状を検討したところ, | | yield(*[0]) # => 0 | a = [0] | yield(*a) # => [0] | |でした.これはまずいんで,両方とも 0 を yield するように変更 そんなこともありましたか。 |を考えると,現状の多重代入の動作は | | (1) 右辺が配列ならそのまま,そうでなければ配列化 | | (2) 先頭に * が付いた変数には代入しなかった残りが配列とし | て代入される | |となっています.で,原さんの案はどうも1を変更しようというも |ののように聞こえます.つまり,配列であるなしにかかわらず,右 |辺の式がひとつだったら配列化しよう(配列でくくろう)と. なーるほど。まず右辺は配列になるわけですね。私は次のように リスト(=カンマで区切られた式)を中心に考えていたんです。 (もちろんリストって現実には配列で表現されるんでしょうが。) (1L) 右辺が配列ならリスト化,そうでなければそのまま (2L) 先頭に * が付いた変数には代入しなかった残りが配列とし て代入される そう考えると (1L) を 次の様に変えれば *a=[0] => a==[0] は自然かと思ったのですが。 (1L') 左辺がリストのとき右辺が配列ならリスト化,そうでな ければそのまま #「左辺がリストのとき」というのは「左辺にカンマがあるとき」と #いうこと。実際には「*a = .. でないとき」ということ。 そうすれば、 |配列を返すメソッドを複数の値を返すメソッドとして使 うことはそのままできるんです。これは結局、左辺をみて右辺をどう するか判断するってことですね。複雑? |上記の変更を施したruby 1.1dの挙動は以下の通りです. | | 1 | 1 | 1 | 1 | 1 | [2] | 2 | 2 | 2 | 2 | |ちょっとは変じゃなくなった? どちらかというと、2 より [2] が望ましいと思っているんですが。 結局、望みは 受けた値をそのまま他に渡したい ってことなんです。これでは [2] の数が減っちゃった。(^^; |each4がちゃんと動くのは偶然のような気がしますが…. そうですね。私もそんな気がします。 | x = 25, 26 | |を許すと,foo(a=25, 26) が構文解析できなくなるんですね.いや, |yaccに悲鳴を上げさせればなんとかならないことはないのでしょう |けど,そういう曖昧な文法はイヤなんです. ふーむ、なるほど。