From: Shin-ichro Hara Date: 1998-12-07T22:51:38+09:00 Subject: [ruby-dev:3757] Re: List() 原です。 In message "[ruby-dev:3754] Re: List()" on 98/12/07, Yukihiro Matsumoto writes: | |まつもと ゆきひろです 結局私も (2) 案なんですが、、 | (2) List案の1 | | returnやyieldは配列ではなく,それに良く似たList(仮称) | を生成する.*a = LISTはa=[LIST]またはa=[[中身]]になる. | 他は一緒. この「a=[[中身]]」というのがわかりません。「*a = LISTはa=[LIST] であり例外はない」というのが原(はら)案なんですが。 | (1) 現状 | | return, yieldにひとつの値を渡すとそのまま,複数の値を | 渡すと配列として渡される | | (2) List案の1 | | returnやyieldは配列ではなく,それに良く似たList(仮称) | を生成する.*a = LISTはa=[LIST]またはa=[[中身]]になる. | 他は一緒. 一応補足すると (2) は2つに分けられて (2a) List案の1a return, yieldにひとつの値を渡すとそのまま,複数の値を 渡すと List(仮称) として渡される.*a = LISTはa=[LIST] になる.他は一緒. (2b) List案の1b returnやyieldは配列ではなく,それに良く似たList(仮称) をいつも生成する.*a = LISTはa=[LIST].他は一緒. となりますが、この両者はほとんど同じなので、(2a) を私の案とします。 List はユーザーには見えないとします。 |で,いろいろ考えて(2)案は有望かなと思ってたんですが,return |のことを考えるとListをユーザに見せないというのはちょっと無理 |だということに気が付きました.そうなると | | この配列のように見えるものが配列かListかいつも意識しなけ | ればならない | |という嬉しくない事態が発生します.違いは多重代入の左辺をrest |だけで受けた時だけなのでさしたる違いではないのでしょうが,私 |がとまどうには十分な理由です.どう思います? なぜ return のことを考えると List をユーザーに見せざるを得ない のかわかりません。そういえば return を話題にするのは初めてです が、、、 foo をメソッドとして return 1, 2 とした場合 x = foo # x = [1, 2] x, *y = foo # x = 1, y = [2] *x = foo # x = [1, 2] return [1, 2] とした場合 x = foo # x = [1, 2] x, *y = foo # x = 1, y = [2] *x = foo # x = [[1, 2]] とするのが私の案です。これは yield 1, 2 を |x|, |x, *y|, |*x| で 受けた場合と全く同様です。もちろん foo.bar とかも [1, 2].bar になるわけです。 なんか、これって Perl のスカラー・コンテクスト、配列コンテクスト みたいでいやらしい様に思われるけどそれは誤解で、return 側はひた すら List (あるいはオブジェクト)を返しているだけです。つまり、 wantarray? があるわけではなくて、場合によって多重代入(の拡張) がなされているだけです。 そして、全体を通じて現状と非互換なのは *x = オブジェクトだけ。 |で,いろいろ考えて(2)案は有望かなと思ってたんですが,return |のことを考えるとListをユーザに見せないというのはちょっと無理 |だということに気が付きました.そうなると あ、もしかして return 1, 2 が何を返しているかってことですか? それはやはり「複数のオブジェクト」かな。いままでなかったもの だから何と呼んでもいいでしょ。(^^; return LIST はナシという案もある。(^^;;