我正在使用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
,但我在反向场景中也有前向引用。这里看起来像小鸡和鸡蛋一样。
答案 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()