通常,您可以在为值赋值之前在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)
}
}
答案 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)
?
然后您的程序具有两种状态,一种是带有部分对象的状态,另一种是带有完成对象的状态。