From: GOTO Kentaro Date: 2008-02-13T18:20:31+09:00 Subject: [ruby-dev:33755] Re: Array の product の戻り値 On 2/13/08, Yukihiro Matsumoto wrote: > ar.product(ar2) {|x| p x} > > とする方がうれしいものなのでしょうか。また、Enumeratorを返す > ということは、戻り値に対しては他の配列的メソッドは使えないわ > けですが、その辺はどうなのでしょう? どっちかというと、まつもとさんへの援軍なのですが、 むかし、自分で * と ** を上書きして直積オブジェクトを返すものを 定義したときは、 for i,j,k,l in [true,false]*[-1,+1]**3 check(i,j,k,l) end みたいな使い方を意図しました。狭い範囲のしらみつぶし用です。 ぼくの場合は、* に割り当てたくらいなので、多次元配列の 生成として使ったわけですが、そうすると、ブロックを受ける 余地はなくなりました。実際、product にしてもチェーンして 使いたいことのほうが単発のイテレーターに使うよりも 多いんじゃないでしょうか。 で、そのころ順列組み合わせとかも作ったのですが、 そっちは配列がでかすぎて値を返すのに時間がかかりすぎるのと、 目的がループの生成のためであること、それから、どのみち繰り返し適用は 出来ない関数なので、おとなしく each_permutation というイテレーターと permutation という順列オブジェクト生成メソッドに分けてました。 というような感じで、直積は繰り返せる演算だけど、 順列組み合わせは列生成、集合生成だと感じました。 実際そういう違いはあるとぼくは思うので、一様にどっちかの型にしても 必ずしも対象の捉え方が単純になるとは考えにくいです。 # メンテナンスしてないので1.8ですら動くかどうか分かりませんが、 # いちおう見えるところにおいてあります。 # http://www.notwork.org/~gotoken/ruby/p/product/ # http://www.notwork.org/~gotoken/ruby/p/as-is/combinatoria.rb ごとけん