Можно ли объявить val перед присваиванием / инициализацией в Scala? - PullRequest
0 голосов
/ 29 июня 2018

В общем, можете ли вы объявить val в scala перед присвоением ему значения? Если нет, то почему нет? Примером, где это может быть полезно (по крайней мере, в моем случае), является то, что я хочу объявить 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)
    }
}

Ответы [ 3 ]

0 голосов
/ 29 июня 2018
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 перед выполнением "обещания" с declareTheVal.

0 голосов
/ 29 июня 2018

Почему бы не определить SomeObjectPartial, который является частично построенным, и class SomeObject(theVal), который принимает значение в качестве параметра?

Тогда ваша программа имеет два состояния: одно с частичным объектом, а другое с завершенным объектом.

0 голосов
/ 29 июня 2018

Мне кажется, что вам нужно lazy val.

A lazy val заполняется по требованию, и результат кэшируется для всех последующих вызовов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...