From: Tanaka Akira Date: 2003-01-01T22:15:02+09:00 Subject: [ruby-dev:19278] Re: ruby-1.8.0 / yield(nil)とyield()のちがい In article <1041420724.492653.22355.nullmailer@picachu.netlab.jp>, matz@ruby-lang.org (Yukihiro Matsumoto) writes: > |したがって、wrapper に |*a| を使うのは無謀なのだろう、というのが私の印 > |象です。そして、だからこそ、wrapper を作るときには |a| で受けるしかな > |いんじゃないのか、というのが私の立場です。 > > うーん、そうなのかなあ。 少なくとも現時点において確実に動く wrapper を作るには。 ここもそうだし、LocalJumpError のところもそうだった気がしますが、drb は Ruby の仕様の不安定な所に依存している気がしますね。 > やっとわかりました。そうすると、やはり*aで受けて*aで渡すとい > うのは不適切なのかなあ。でも、今度はyield nilとyieldの区別が > つかないしなあ(区別する必要はないような気もしますが)。 yield は return と同様に一つの値しか扱えない、と(私は)理解しているので、 値を指定しなければ nil を指定したことになるのは自然だ、と思っています。 ただ、1.6.8 で yield *[] と yield *[nil] を区別できるということを知っ てしまったのでその理解は揺らいでますが。 (む。return *[] は [] を返して、return *[nil] は [nil] を返すけど、こ れは意図されているのかなぁ。) それはそれとして、もし可能なら、*a のほうがいいと思います。*a のほうが 直観的だと思うので。 ここで、直観的というのは、私が以前同じような議論を持ちかけたときに私も wrapper は *a で実現できるものだと思っていたこと、原さんもそういう誤解 をしたと言っていたような気がすること、咳さんも(誰に教えられるでもなく) *a を使っていること、メソッドの引数の転送には *a を使うことからの類推 がきくこと、というあたりが根拠です。 だから、人間の直観のとおりに動くことを標榜する Ruby としては、可能なら そうしたほうがいいと思います。ついでにいえば、このへんを完全に理解する ことは非常に困難であり、仮に理解したとしても今回のように変化することか ら、必然的に繰り返し驚かされる上、理解したからといってたいして役にたつ わけじゃないですし。たぶん。 ただ、ここでいう「可能なら」というのはそのためにどの程度の犠牲を払うか という問題なわけで、少なくとも互換性がいくつかの点で犠牲になることはほ ぼ確実でしょう。また、(毎日 wrapper みたいなメタなことばかり書くわけじゃ ないですから)普段の生活におけるトータルな使いやすさに関して考慮が必要 です。 で、普段の生活における使いやすさに関する話が > こうすると、その延長線上として > > *a = [1,2] > > が[[1,2]]となることとなり、結果として「配列でエミュレートさ > れている多値戻り値」が使えなくなると思います。ちゃんとした多 > 値を導入するとかいう話もありえないではないですが。 というところなわけですが、返り値も多値にしてしまう(つまりちゃんとした 多値を導入する)か、あるいはそうしなくても *a = *[1,2] って書けばいいからそれほど使い勝手は変わらないんじゃないか、と思ってい ます。 もちろん、wrapper を *a で書けるようにするためにそこまでの犠牲(コスト) を払うのか、という話が最後にあるわけですけど。 -- [田中 哲][たなか あきら][Tanaka Akira]