是否可以在Scala中进行赋值/初始化之前声明val?

时间:2018-06-29 15:11:36

标签: scala initialization declaration lazy-initialization

通常,您可以在为值赋值之前在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)
    }
}

3 个答案:

答案 0 :(得分:2)

hourly_df.merge(daily_index, how = 'inner', ...)

如果您在使用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) } } 来完成“承诺”之前尝试使用NoSuchElementException,它将以theValIWantToDeclare崩溃。

答案 1 :(得分:0)

在我看来,您需要一个lazy值。

根据需要填充lazy val,并将结果缓存为所有后续调用。

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

答案 2 :(得分:0)

为什么不定义部分构造的SomeObjectPartial和以值作为参数的class SomeObject(theVal)

然后您的程序具有两种状态,一种是带有部分对象的状态,另一种是带有完成对象的状态。