遠藤です。

2009年9月10日22:39 Yukihiro Matsumoto <matz / ruby-lang.org>:
> まつもと ゆきひろです
>
> In message "Re: [ruby-dev:39277] Why doesn't Array#product return Enumerator?"
>    on Thu, 10 Sep 2009 01:48:38 +0900, Yusuke ENDOH <mame / tsg.ne.jp> writes:
>
> |Array#product は Enumerator でなく配列を返しますが、何か理由が
> |あってのことでしょうか。
>
> permutationやcombinationはブロックを受けるのが基本型で、ブロッ
> クがない形式では他のメソッドにならいEnumeratorを返しています。
> 一方、productは(配列として)積を返すのが基本型で、ブロックを受
> ける形式はありません。この違いが理由です。

う、本当に聞きたかったのは「なんで product だけ permutation
たちと違うインターフェイスになっているのか」です。


> |Array#permutation や combination のように Enumerator を返した方が
> |自然かつ便利だと思います。これらのメソッドは brute force 的な探索に
> |よく使いますが、product だけ探索前に巨大な配列を確保してしまうので
> |いやらしいです。
> |
> |仕様変更になってしまいますが、一応言ってみました。どうでしょうか。
>
> 私自身はこれらのメソッドを使わないので、これらが「自然かつ便
> 利」かどうか判断できません。

「自然」というのは permutation や combination と同じだからです
(上の文はちょっと論理が変でした) 。自然と言うか一貫性ですね。

あと、巨大な積を each したい場合に「便利」です。そういう場合は
パズルを解く場合や総当りテストをする場合にそこそこ発生します。
いきなり配列を返すのだと、each し始める前に巨大な配列が確保
されてしまいます。product がブロックを受け取ってくれればこの
問題はなくなります。従来どおり配列がほしいなら .to_a するだけ
でできます。


> ただ、言葉の意味から考えると
> productと言われて、積ではなくEnumeratorを返すのはおかしい気が
> します。まあ、それならばpermutationやcombinationも十分におか
> しいと言われればその通りなんですが。

今だって「積」というものではなく配列を返しているのですが、
配列はよくても Enumerator はダメなんでしょうか。

-- 
Yusuke ENDOH <mame / tsg.ne.jp>