是否可以在 Scala 中的 assignment/initialization 之前声明一个 val?

Is it possible to declare a val before assignment/initialization in Scala?

一般来说,你能在scala中先声明一个val再赋值吗?如果不是,为什么不呢?这可能有用的一个例子(至少在我的例子中)是我想声明一个 val ,它将在比我分配它时更大的范围内可用。如果我做不到,我怎样才能达到预期的效果?

而且我希望这是一个 val,而不是 var,因为在分配它之后,它永远不会改变,所以 var 并不理想。

例如:

object SomeObject {
    val theValIWantToDeclare // I don't have enough info to assign it here

    def main(): Unit = {
        theValIWantToDeclare = "some value"
    }

    def someOtherFunc(): Unit {
        val blah = someOperationWith(theValIWantToDeclare)
    }
}

我觉得你需要一个 lazy 值。

一个 lazy val 按需填充,结果被缓存以供所有后续调用使用。

https://blog.codecentric.de/en/2016/02/lazy-vals-scala-look-hood/

object SomeObject {
  private var tviwtdPromise: Option[Int] = None
  lazy val theValIWantToDeclare: Int = tviwtdPromise.get
  private def declareTheVal(v: Int): Unit = {
    tviwtdPromise = Some(v)
    theValIWantToDeclare
  }

  def main(args: Array[String]): Unit = {
    declareTheVal(42)
    someOtherFunction()
  }

  def someOtherFunction(): Unit = {
    println(theValIWantToDeclare)
  }
}

如果您在使用 declareTheVal 完成 "promise" 之前尝试使用 theValIWantToDeclare,它将崩溃并显示 NoSuchElementException

为什么不定义一个部分构造的SomeObjectPartial,和取值为参数的class SomeObject(theVal)

那么你的程序有两种状态,一种是部分对象,另一种是已完成的对象。