如何使用播放迭代创建无限枚举器

时间:2014-04-25 18:24:16

标签: scala playframework iterate

我希望能够创建一个无限重复一系列元素的枚举器,但是我在找出方法时遇到了麻烦。当我创建一个递归的枚举器时,我尝试引用它时似乎溢出了堆栈。例如,为了创建一个重复A,B,C,D,A,B,C,D,A,B,C,D,A的枚举器......我希望使用类似的东西:

scala> lazy val e1: Enumerator[String] = Enumerator("a","b","c","d") andThen e1
e1: play.api.libs.iteratee.Enumerator[String] = <lazy>

然后尝试以任何方式使用它我得到堆栈溢出:

scala> e1 through Enumeratee.take(1) apply Iteratee.foreach(println(_)
java.lang.StackOverflowError
    at .e1$lzycompute(<console>:11)
    at .e1(<console>:11)
    at .e1$lzycompute(<console>:11)
    at .e1(<console>:11)
    at .e1$lzycompute(<console>:11)
    at .e1(<console>:11)

1 个答案:

答案 0 :(得分:3)

AHA!回答我自己的问题

感谢@travis和@cmbaxter指导我指明方向。我正在查看旧的源代码和旧的api文档,并没有看到像重复这样的新方法。我的票证正在展开:

scala> val s: Stream[String] = "A" #:: "B" #:: "C" #:: "D" #:: s
s: Stream[String] = Stream(A, ?)

scala> Enumerator.unfold(s)(s => Some(s.tail, s.head)) through Enumeratee.take(10) apply Iteratee.foreach(println(_))
res3: scala.concurrent.Future[play.api.libs.iteratee.Iteratee[String,Unit]] = scala.concurrent.impl.Promise$DefaultPromise@55d3e052

scala> A
B
C
D
A
B
C
D
A
B