Ответ 1
Если вы используете выпуск 2.0, это ошибка, которая была исправлена в последующих выпусках. Enumeratee используется для отправки по EOF, который он получает, и это было ошибкой.
Я хочу применить enumeratee к 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". Кажется, только рассмотрим части, добавленные к адаптированному итератору.
Как я могу вернуть исходный текст после использования enumeratee?
Если вы используете выпуск 2.0, это ошибка, которая была исправлена в последующих выпусках. Enumeratee используется для отправки по EOF, который он получает, и это было ошибкой.