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

是否可以在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

通常,在为val赋值之前,是否可以在scala中声明val?若否,原因为何?这可能有用的一个例子(至少在我的情况下)是,我想声明一个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
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)
  }
}