【问题标题】:Is it possible to declare a val before assignment/initialization in Scala?是否可以在 Scala 中的赋值/初始化之前声明一个 val?
【发布时间】:2018-06-29 15:11:36
【问题描述】:

一般来说,你可以在给它赋值之前在 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)
    }
}

【问题讨论】:

    标签: scala initialization declaration lazy-initialization


    【解决方案1】:
    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 履行“承诺”之前尝试使用theValIWantToDeclare,它将因NoSuchElementException 而崩溃。

    【讨论】:

    • 这看起来可以解决我的问题!一个问题,私有def函数中的:theValIWantToDeclare()是做什么的?你不只需要 tviwtdPromise = Some(v) 行吗?
    • 还有Promise
    • @MichaelBlankenship 你绝对应该强制theValIWantToDeclare 现在通过在语句位置使用它来评估值。否则,您可以多次“重新声明”它,并且每次都会覆盖隐藏的 tviwtdPromise 值。最后的() 只是为了明确返回Unit。没必要,其实我已经删了。
    • @som-snytt 是的,但 AFAIR 它需要一些带有默认执行程序池的奇怪导入等。我决定将Promise 添加到组合中会比更多“干”更令人困惑。跨度>
    • @AndreyTyukin 我非常感谢您的解决方案以及回答我的第二个问题。很好的解释!谢谢! :)
    【解决方案2】:

    听起来你需要一个lazy val。

    按需填充lazy val,并将结果缓存以供所有后续调用使用。

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

    【讨论】:

    • 问题是懒惰对我没有帮助,因为我在声明时没有“一些价值”。所以,我没有在需要 val 时执行的“表达式”。
    【解决方案3】:

    为什么不定义一个部分构造的SomeObjectPartial,以及将值作为参数的class SomeObject(theVal)

    那么你的程序有两种状态,一种是部分对象,另一种是完成对象。

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 2011-04-15
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多