Scala:正向引用出现问题+;循环计数器

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)

我使用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) { 
            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
之前定义val
clock
,但在相反的场景中,我也有一个正向引用。这似乎是个鸡毛蒜皮的问题。

也许课程不是关于变量捕获如何工作,而是关于使用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
。这将是一个混乱的代码,因为它非常“副作用”,但这将是朝着正确方向迈出的一步。