Scala:正向引用出现问题+;循环计数器
我使用Akka调度程序来交错发送列表中的消息,该列表是通过读取文件中的行来构建的。下面是一些代码:Scala:正向引用出现问题+;循环计数器,scala,playframework,akka,Scala,Playframework,Akka,我使用Akka调度程序来交错发送列表中的消息,该列表是通过读取文件中的行来构建的。下面是一些代码: def startClock { val filename = "conf/my_file.json" val lines = scala.io.Source.fromFile(filename).getLines.toList var linePtr = 0 if(linePtr == lines.length)
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[前向引用扩展了值时钟的定义]
我必须将时钟设置为延迟,然后在下一行引用它,以便触发启动锁,而这一部分做得很好。我这里的问题是,
linePtr
总是0
。它从不递增,但else{}
块中的代码始终被确认为命中。我这里基本上只有无限递归,我对Scala不够熟悉,无法确定我在这里做错了什么。我还尝试在startClock
之前定义valclock
,但在相反的场景中,我也有一个正向引用。这似乎是个鸡毛蒜皮的问题。也许课程不是关于变量捕获如何工作,而是关于使用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()
也许课程不是关于变量捕获如何工作,而是关于使用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()
我看到的一个问题是
linePtr
被定义为startClock
函数的本地。每次调度程序调用startClock
时,它总是将linePtr
设置为0,因此它总是命中else语句。如果要正确递增,则可能应该在startClock
函数之外定义filename
、行
、和linePtr
。这将是一个混乱的代码,因为它非常“副作用”,但这将是朝着正确方向迈出的一步。我可以看到的一个问题是linePtr
被定义为startClock
函数的本地。每次调度程序调用startClock
时,它总是将linePtr
设置为0,因此它总是命中else语句。如果要正确递增,则可能应该在startClock
函数之外定义filename
、行
、和linePtr
。这将是一个混乱的代码,因为它非常“副作用”,但这将是朝着正确方向迈出的一步。