0

列挙子をイテラティーに適用し、その後元のイテラティーを元に戻したいので、さらに適用することができます。Iteratee [Int、Int]を使用して入力を要約する例がPlayドキュメントにあります(http://www.playframework.org/documentation/2.0.1/Enumeratees)。次に、「3」や「6」などの文字列を入力として使用できるEnumeratee [String、Int]を使用します。例は次のとおりです。

val sum:Iteratee[Int,Int] = Iteratee.fold[Int,Int](0){ (s,e) => s + e }

//create am Enumeratee using the map method on Enumeratee
val toInt: Enumeratee[String,Int] = Enumeratee.map[String]{ s => s.toInt } 

val adaptedIteratee: Iteratee[String,Iteratee[Int,Int]] = toInt(sum)

// pushing some strings
val afterPushingStrings: Iteratee[String,Iteratee[Int,Int]] = {
  Enumerator("1","2","3","4") >>> adaptedIteratee
}

val originalIteratee: Iteratee[Int,Int] = flatten(afterPushingString.run)

val moreInts: Iteratee[Int,Int] = Enumerator(5,6,7) >>> originalIteratee

moreInts.run.onRedeem(sum => println(sum) ) // eventually prints 28

ただし、列挙子。>>>は、反復子ではなく、パラメーターとして別の列挙子を使用するため、これはコンパイルされません。代わりに|>>を使用して試しました:

val sum: Iteratee[Int, Int] = Iteratee.fold[Int, Int](0) { (s, e) => s + e }

//create am Enumeratee using the map method on Enumeratee
val toInt: Enumeratee[String, Int] = Enumeratee.map[String] { s => s.toInt }

val adaptedIteratee: Iteratee[String, Iteratee[Int, Int]] = toInt(sum)

// pushing some strings
val afterPushingStrings: Iteratee[String, Iteratee[Int, Int]] = {
  Iteratee.flatten(Enumerator("1", "2", "3", "4") |>> adaptedIteratee)
}

val originalIteratee: Iteratee[Int, Int] = Iteratee.flatten(afterPushingStrings.run)

val moreInts: Iteratee[Int, Int] = Iteratee.flatten(Enumerator(5, 6, 7) |>> originalIteratee)

moreInts.run.onRedeem(sum => println("Sum="+sum)) // eventually prints 28

ただし、この例では「28」ではなく「10」が出力されます。適合されたイテラティーに追加されたパーツのみを考慮しているようです。

列挙子を使用するときに元のイテラティーを元に戻すにはどうすればよいですか?

4

1 に答える 1

3

2.0 リリースを使用している場合、これは後のリリースで修正されたバグです。Enumeratee は受信した EOF を送信していましたが、これがバグでした。

于 2012-06-10T12:41:43.207 に答える