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

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

16 messages 2013/01/29

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

From: 小田 利通 <oda@...>
Date: 2013-01-31 17:25:42 UTC
List: ruby-list #49168
あらきさん、メールありがとうございます。

》Enumeratorは列挙自体を表すクラス(だと思う)なので、「列挙を合成する」よりは
》「列挙するものを予め合成してから列挙」の方が自然なのではないかと思います。

Enumerator は、ヘルプにあるように
     Enumerable の機能を提供するためのラッパークラス
  と 外部イテレータ
の2つの役割をするクラスです。

Enumerator を使う人は、Array を意識しているのではないかと思っています。
つまり、

 [0,1,2,3,4,5].each {|i| puts i}

とするのを意識しながら

 (0..5).each {|i| puts i}

と書いているじゃないかと。(違いは遅延評価ですね)

であれば、

  ([0,1,2]+[4,5]).each {|i| puts i}

に対応する

  ((0..2).each+(4..5).each).each {|i| puts i}

という表記があってもよいのではないかと思います。

 Rangeオブジェクトの + もあっても良いとも思うのですが、

  class Range
    def +(other)
      other=other.each unless other.kind_of?(Enumerator)
      self.each + other
    end
  end

Rangeオブジェクト同士の加算の結果が Rangeオブジェクトでないというのは、
違和感があるので議論の余地があると思います。

》またEnumeratorに合成の機能を付けてしまうと、型を無視した合成が可能になってしまうのであまりよくないのではないでしょうか?

each メソッドがブロックに渡すのは、同じクラスのオブジェクトとは限りません。
つまり

  [0, 1, "A", :foo].each {|i| puts i}

であっても問題ありません。
これは Array だけでなく Enumerator についても同様です。

小田 http://www.alato.ne.jp/oda

In This Thread