From: Shin-ichro Hara Date: 1998-12-02T02:28:51+09:00 Subject: [ruby-dev:3728] Re: multiple assignment, yield and return 原です。 In message "[ruby-dev:3725] Re: multiple assignment, yield and return" on 98/12/01, MAEDA Shugo writes: | |前田です。 | |>>>>> In [ruby-dev:3722] |>>>>> "原" == Shin-ichro Hara san wrote: | |原> |yield(1) #=> args == [1] | |原> この方式の問題点は今まで 1 をそのまま返したのに、それを配列にし |原> たところでオーバーヘッドがあるという所ですよね。 | |多重代入を使うのをやめる、という案なので、必ずしも、Rubyの配列を |生成する必要はないと思います。 |# Rubyの配列を生成する必要があるのは|*x|を使う時だけです。 |コスト的にはメソッドと同じと考えてよいのではないでしょうか。 ああ、そうですね。今までポインタを渡していたところをそのポイ ンタへのポインタを渡す事になる程度にコストが増えるわけですね。 これは、先の List の話で、yield(Y) で Y が 2 個以上のリスト のときのみ yield(List.new(Y)) に変換していた所を、常に(Y が 1個のリストでも) yield(List.new(Y)) を渡すことにしたのと殆 んど考えは同じですね。結局コストも殆んど同じだなあ、きっと。 ブロックパラメータで、値を受ける方の考えは前田さんと私のは だいぶ異なるけど。 |原> そこで、args == [1,2] となったとき、yield(1, 2) なのか yield([1, 2]) |原> なのかを区別するためにフラグを立てるという方法も提案されているわけ |原> ですが、、。 | |現状のモデルではyield(1, 2)はyield([1, 2])の略記法とのことなので、 |モデル変更しないのなら区別するのも不自然な気がします。 ええ、もうモデルを完全に変更するという前提で話をしています。(^^; |やはり互換性を維持した上で、シンプルなモデルにするのは無理みたいですね:-( ううむ。私は今だに *x = a で x = [a] の意味になるところのみ非互 換で GO で OK だと考えてるのですが。 つまり yield への値の渡し方をフラグ式でも原式Listでも前田式配列 でもどれでもいいから yield([1,2]) と yield(1,2) が区別できるよう に変更して、ブロックパラメータへの代入は従来の多重代入の方法を用 いる。ここで *x = a のみ x = [a] とする非互換を設ける、という考 えなんだけど。