是否可以在 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)
?
那么你的程序有两种状态,一种是部分对象,另一种是已完成的对象。
一般来说,你能在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)
?
那么你的程序有两种状态,一种是部分对象,另一种是已完成的对象。