[#49148] Ruby 1.9で、バイト長の部分文字列を作りたくて悩んでます — Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>

はじめまして。横塚と申します。

16 messages 2013/01/29

[ruby-list:49169] Re: Enumerator#+

From: "H.Hiro" <main@...>
Date: 2013-01-31 17:28:44 UTC
List: ruby-list #49169
H.Hiroです。

> 小田と申します。
>
> 困っているとかでなく、単なる興味ですが、
> Enumerator にインスタンスメソッド +@ がないのは、なぜでしょう?

確かに、列挙できるようなものを複数返されたときに、「それを一つの列挙できるものとして扱いたい」という意義はあるように思います。
例えば、「ユーザーコードからEnumeratorを受け取り、それを元に処理するライブラリ」があれば、バラバラに受け取ったEnumeratorを繋いでおく意味があるかなと。

で英語でぐぐってたら、4年ほど前に同じ提案がなされていて、knu氏が提案不採用という裁決を出しています。
http://bugs.ruby-lang.org/issues/709
理由を読むと

- Enumeratorを連結するというのが、そんなに普通に使われることなのか判断しかねる
- 演算子の意味は、一貫性・体系的であること・直感的にわかりやすいこと・実用性を踏まえて注意深く選ぶべきものである(普通のメソッドとは異なり、記号しか使わない=メソッドの意味が直接は見えないわけなので、意味づけを注意深く行うべき、ということと思われる)
- このケースの場合、他のタイプのイテレータ(現状ではEnumeratorは「前方に進む」ことしか保証されていないが、逆戻りが許されるものなども考えられる。C++には実際にある)が導入される可能性はあるわけで、そういう場合に整合性が取れるのかも考慮すべきである

といったことを挙げ、Enumerator#+はそこまでは値しないと判断した模様です。

という意見を見つつも、私はEnumerator#+の導入は賛成です。理由としては
- Arrayの+演算子と同等の意味になるため、わかりにくいということはない
- 現状では、(自前で上記の小田さんのような定義をするのでなければ)一旦to_aしてから連結することになり、処理効率の面でも悪い
ためです。

--
H.Hiro / Maraigue
http://hhiro.net/about/
main@hhiro.net

In This Thread