是否可以在Scala中的赋值/初始化之前声明val?
通常,在为val赋值之前,是否可以在scala中声明val?若否,原因为何?这可能有用的一个例子(至少在我的情况下)是,我想声明一个val,该val的可用范围比我分配它时要大。如果我不能做到这一点,我如何才能达到预期的行为 我希望这是一个val,而不是一个var,因为在赋值之后,它永远不会改变,所以var不是理想的 例如:是否可以在Scala中的赋值/初始化之前声明val?,scala,initialization,declaration,lazy-initialization,Scala,Initialization,Declaration,Lazy Initialization,通常,在为val赋值之前,是否可以在scala中声明val?若否,原因为何?这可能有用的一个例子(至少在我的情况下)是,我想声明一个val,该val的可用范围比我分配它时要大。如果我不能做到这一点,我如何才能达到预期的行为 我希望这是一个val,而不是一个var,因为在赋值之后,它永远不会改变,所以var不是理想的 例如: object SomeObject { val theValIWantToDeclare // I don't have enough info to assign
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
val
根据需要填充lazy
val,并缓存所有后续调用的结果
如果您尝试在使用
declareTheVal履行“承诺”之前使用声明的有效性,那么它将因非接触式异常而崩溃,为什么不定义一个部分构造的SomeObjectPartial
,以及将该值作为参数的类SomeObject(theVal)
然后,您的程序有两种状态,一种是部分对象,另一种是完成对象。问题是懒惰对我没有帮助,因为我在声明时没有“一些值”。因此,我没有在需要val时执行的“表达式”。这看起来可以解决我的问题!有一个问题:theValIWantToDeclare()在私有def函数中做什么?难道你不需要tviwtdPromise=Some(v)行吗?还有Promise
@MichaelBlankenship,你肯定应该强制ValidWantDeclare
立即在语句位置使用它来计算值。否则,您可以多次“重新声明”,每次都会覆盖隐藏的tviwtdPromise
值。最后的()
只是为了明确返回单元。事实上,它不是必需的,我已经删除了它。@som snytt是的,但是AFAIR它需要一些带有默认执行器池等的奇怪导入。我决定将Promise
添加到混合中会比更“干”更让人困惑。@AndreyTyukin我非常感谢您的解决方案以及回答我的第二个问题。很好的解释!谢谢!:)
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)
}
}