Forward reference extends over definition

Problem

So, I was writing a Vert.x periodic task and wanted to cancel that task in its handler itself on some condition.

I wrote the following code.

import java.lang
import io.vertx.core.{Handler, Vertx}

object lazyFuture {
  private val vertx: Vertx = Vertx.vertx()
  var count: Int = 0

  def main(args: Array[String]): Unit = {
    val periodId: Long = vertx.setPeriodic(1000, new Handler[lang.Long] {
      override def handle(event: lang.Long): Unit = {
        println(s"the count is at $count")
        if (count >= 1) {
          println("i've done once. wont do it again! because state management is yet to be implemented.")
          val isCancelled = vertx.cancelTimer(periodId)
          println(s"periodic task cancelled? : $isCancelled")
        }
        else {
          println("doing some work periodically!!")
        }
        count = count + 1
      }
    })
  }
}

But compilation gave me the following error:

Error:(17, 47) forward reference extends over definition of value periodId

val isCancelled = vertx.cancelTimer(periodId)

It basically says that, I am actually trying to use(forward reference) the val periodId in its own definition. which i can/should not do as it is yet to be defined.

Solution

I just delayed its definition by using lazy keyword.

And then, when i called the lazily lying val periodId, it got happily defined.

import java.lang
import io.vertx.core.{Handler, Vertx}

object lazyFuture {
  private val vertx: Vertx = Vertx.vertx()
  var count: Int = 0

  def main(args: Array[String]): Unit = {
    lazy val periodId: Long = vertx.setPeriodic(1000, new Handler[lang.Long] {
      override def handle(event: lang.Long): Unit = {
        println(s"the count is at $count")
        if (count >= 1) {
          println("i've done once. wont do it again! because state management is yet to be implemented.")
          val isCancelled = vertx.cancelTimer(periodId)
          println(s"periodic task cancelled? : $isCancelled")
        }
        else {
          println("doing some work periodically!!")
        }
        count = count + 1
      }
    })

    println("Calling the lazily lying periodId: " + periodId)
  }
}

Helpful?

If you think this is helpful 🎈
Don't keep it to yourself 🙊

Share it with your lovely followers at twitter 🗽

lets connect viatwitter