Scala:在应用枚举后得到原始的iteratee(播放文档中的示例无法编译)

时间:2012-06-10 12:18:58

标签: scala playframework playframework-2.0 enumerator iterate

我想将一个枚举数应用于一个iteratee,然后将原始的iteratee返回给我,这样我就可以应用更多东西了。播放文档中有一个例子,它使用了Iteratee [Int,Int],只是总结了它的输入(http://www.playframework.org/documentation/2.0.1/Enumeratees)。然后他们使用Enumeratee [String,Int],它允许像“3”和“6”这样的字符串作为输入。示例如下:

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

但这不能编译,因为Enumerator。>>>将另一个Enumerator作为参数 - 而不是迭代。我尝试使用|>>代替:

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”。它似乎只考虑添加到适应的迭代中的部分。

使用枚举器时如何恢复原始的迭代?

1 个答案:

答案 0 :(得分:3)

如果您使用的是2.0版本,那么这是一个在以后的版本中修复的错误。 Enumeratee曾经沿着收到的EOF发送,这就是错误。