プログラミング言語 Scala Wiki

Example13.2

13.2 イテレータの構築 (Constructing Iterators)

具体的なイテレータは、クラス Iterator の2つの抽象メソッド next と hasNext の実装を提供する必要があります。もっとも単純なイテレータは、常に空の列を返す Iterator.empty です。

object Iterator {
    object empty extends Iterator[Nothing] {
        def hasNext = false
        def next = error("next on empty iterator")
    }

もっと面白みのあるイテレータは、配列のすべての要素を列挙するものです。このイテレータはオブジェクト Iterator で定義されている fromArray メソッドで構築されます。

    def fromArray[A](xs: Array[A]) = new Iterator[A] {
        private var i = 0
        def hasNext: Boolean =
            i < xs.length
        def next: A =
            if (i < xs.length) { val x = xs(i); i += 1; x }
            else error("next on empty iterator")
    }

ほかのイテレータとして、範囲内の整数を列挙するものがあります。Iterator.range 関数は、与えられた範囲の整数値をたどるイテレータを返します。

object Iterator {
  def range(start: Int, end: Int) = new Iterator[Int] {
        private var current = start
        def hasNext = current < end
        def next = {
            val r = current
            if (current < end) current += 1
            else error("end of iterator")
            r
        }
    }
}

ここまで見てきたイテレータはいずれ終わりますが、永遠に続くイテレータも定義できます。たとえば、次のイテレータは初期値からずっと続く整数を返します(*1)。

def from(start: Int) = new Iterator[Int] {
    private var last = start 1
    def hasNext = true
    def next = { last += 1; last }
}

(*1) int 型が有限の表現であるため、2^31で数は元に戻ります。


名前:
コメント:

1 はじめに
2 最初の例
3 アクターとメッセージによるプログラミング

+  4 式と簡単な関数
+  5 第一級の関数

6 クラスとオブジェクト

+  7 ケースクラスとパターンマッチング
+  8 ジェネリックな型とメソッド
+  9 リスト
+  10 For内包表記
+  11 ミュータブルな状態

12 ストリームによる計算

+  13 イテレータ

14 遅延評価val
15 暗黙のパラメータと変換
16 Hindley/Milner 型推論

+  17 並列処理の抽象

参考文献