From: Shin-ichiro HARA Date: 2002-11-20T15:55:45+09:00 Subject: [ruby-dev:18857] Re: Enumerable#zip 原です。 In [ruby-dev:18853] Re: Enumerable#zip Tanaka Akira writes: >あと、[].transpose が [] になるのが適切かどうか、ですね。 > >一応、私は [] よりは nil ないし例外だろう、という立場なわけですが、微 >妙な所ではあります。 > >transpose はそれ自身が逆関数であり、x.transpose == [] となる x は複数 >あるので、[].transpose は不定で、[] とするのはよろしくない、という話は >あります。 私も最初そのように、つまり「x.transpose == [] となる x は複数あるので [].transpose は不定」と考えたのですが、今ちょっと違って、「[] そのもの が2重配列として不定であるので、[].transpose は不定」と考えています。 だから、 (1) [] は不定なので [].transpose が不定な [] を返すのは丁度よい。 (2) [] は行数 0、列数不定なので、[].transpose は列数不定、行数 0 であるオブジェクトを返すなら納得するが、元の [] を返すのはむ しろ逆ではないか。 のどちらかになると思う。後者なら [].transpose は nil か 例外ですね。 >また、[].transpose.transpose == [] はまちがってないんだからここだけで >も使えるほうが良かろうという考え方もあります。 > >実際の所どれが使いやすいかなぁ。 [ruby-dev:18831] の a = IO.readlines("/etc/passwd").map {|line| line.split(/:/)} の例で言うと、ユーザーがひとりも居ない場合、a == [] となるから、この時 b = a.transpose は、/etc/passwd の規定のフィールド数以内の i について は b[i] は []、そうでなければ nil であってほしい。しかし「規定のフィー ルド数」という情報が a には無い、、、という状況ですね。 「任意の i について x[i] == [] となる Array のインスタンス x」を [].transpose の返り値にすると便利だったかもしれないけれど、そのような オブジェクトは存在しない。 結局、このコードを含む処理において、b = [].transpose を、例外にするか nil にするか [] にするかという問題は、transpose した時点で例外にするか、 b.each などを評価した時点で例外にするか、b[i].each などを評価した時点 で例外にするか、という問題なわけです。何らかの対処をしない限り、どれを 選択してもいずれどこかで例外発生は避けられない。 それならなるべく早めに、例外にすればいい、という考えもあるし、 (b || [[]] * n)[i].each あるいは、(b[i] || []).each みたいに、例外の発 生をなるべく手軽に押さえられた方が楽という考えもあるし、、、どうなんで しょうね、という結論。(^^;