From: Shin-ichro Hara Date: 1998-11-20T17:58:57+09:00 Subject: [ruby-dev:3614] Re: Multiple assignment at yield() 原です。 In message "[ruby-dev:3611] Re: Multiple assignment at yield()" on 98/11/20, Yukihiro Matsumoto writes: |まつもと ゆきひろです |原さんの提案は理解できたように思います. よかった。やさしいものを複雑に表現するのがくせなので。 |気になるのは以下の点です. | | * ややモデルが複雑化しているが,それを正当化するメリットが | あるか(「*a = [2]」のメリットは理解できますが) 私は実は最初多重代入って <-= だと思ってたんです。 | * 現在の配列化はto_aメソッドを使っており,ユーザレベルで制 | 御できるが「強制的な配列化」にはその余地がないように思わ | れる.よって,たとえば構造体が右辺に来た時の挙動が異なる | ように感じられる.つまり | | dev, ino = File.stat(path) | | の結果が<==ではデバイス番号,i-node番号の取り出しになる | のに対して,<-=ではdevにStat構造体が入り,inoがnilになる | ように思うのですが,どうでしょう? なるほど。やっぱり配列化って to_a を使っていたとは。面白いなあ。 つまり私の書いた A(x) はまさに x.to_a だったんだ。(x が単項の 時は。) 確かにこのメカニズムは捨て難いですね。<-= で to_a をうまく起動す る方法は今ちょっと思いつきません。ちょっと考えてみます。(^^; ||とする。結局、、前者と後者の違いは、yield(*[1]) が [1] になるか 1 にな ||るかだけだと思いますが。 | |えーと,私の読み違いでなければ,新しい定義では [1] になるん |ですよね.これの目的がいまいち分からないんですが. いえ 1 になるんですよ。定義は |でした。これをこう定義し直したらどうでしょうか。まず *t <-= Y を計 |算し、 | | |x| #=> x = nil [ t が [] のとき ] | = a [ t が [a] のとき ] | = t [ それ以外 ] でしたよね。yield(*[1]) は *t <-= *[1] *t <- B(*[1]) *t <- B(1) *t <- [1] t = [1] # [[1]] ではない。 よって | = a [ t が [a] のとき ] の a = 1 の場合です。右辺をリストで書くと分かりやすいのですが。