Scala:遇到前向引用+循环计数器问题

时间:2014-02-21 17:46:47

标签: scala playframework akka

我正在使用Akka调度程序来错开从List中发送消息,这是通过读取文件行构建的。这是一些代码:

 def startClock {
          val filename = "conf/my_file.json"
          val lines = scala.io.Source.fromFile(filename).getLines.toList
          var linePtr = 0

          if(linePtr == lines.length) { 
            clock.cancel()
          }
          else {
            Logger.info(s"num: $linePtr")
            default ! Message(lines(linePtr))
            linePtr = linePtr + 1
          }
        }

lazy val clock: Cancellable = Akka.system.scheduler.schedule(Duration.Zero, Duration.create(5000, TimeUnit.MILLISECONDS))(startClock)
val x = clock

现在为了解决前向引用编译器错误,如下所示:play.PlayExceptions$CompilationException: Compilation error[forward reference extends over definition of value clock]

我必须将时钟设置为lazy,然后在下一行引用它以触发startClock,并且它可以正常运行。我在这里遇到的问题是linePtr始终是0。它永远不会递增,但else {}块中的代码始终会被确认。我基本上只是在这里有无限的递归,我对Scala不够熟悉,无法确定我在这里做错了什么。我也尝试在clock之前定义val startClock,但我在反向场景中也有前向引用。这里看起来像小鸡和鸡蛋一样。

1 个答案:

答案 0 :(得分:4)

也许课程不是关于变量捕获如何工作,而是关于使用API​​。由于getLines为您提供了迭代器,因此只需使用它进行迭代即可。推测:

val lines = Source.fromFile(f).getLines
val clock = scheduler schedule send
def send  = if (lines.hasNext) d ! Message(lines.next) else clock.cancel()