如何使用仅在运行时知道的值初始化对象val?

时间:2012-01-08 23:41:49

标签: scala

让我们说我试图写一个简单的Tic-Tac-Toe游戏。它有一个M×N场。游戏只有一个字段,所以它可能应该用单个object来表示。像这样:

object Field {
    val height : Int = 20
    val width : Int = 15
    ...
}

但是我不想对高度和宽度进行硬编码,所以如果可以在运行时通过构造函数或其他东西传递给对象,那将会很好。但是object s不能有构造函数。

好吧,我可以将heightwidth更改为var s,而不是val s并引入新方法

def reconfigure (h:Int, w:Int) = {
    height = h
    width = w
}

并在游戏开始时调用它。但它也不优雅。

那么,是否有一种巧妙的方法 - 即使用运行时之前未知的值初始化对象val

3 个答案:

答案 0 :(得分:15)

为什么不使用class并初始化main中的一个实例?

case class Field(width: Int, height: Int) {
  //...
}

object Main {
  def main(args: Array[String]): Unit = {
    val field = Field(30, 25)
  }
}

答案 1 :(得分:13)

你可以使用懒惰的vals。这可能会使您仍然需要使用var。

的事情变得更加复杂
case class Config( height: Int, width: Int )
object Field {
  val defaultConfig = Config( 20, 15 )
  var config: Option[Config] = None
  def getConfig = config.getOrElse( defaultConfig )
  lazy val height = getConfig.height
  lazy val width = getConfig.width
}
object Main extends App {
  Field.config = Some( Config( 30, 25 ) )
}

答案 2 :(得分:4)

一个选项是懒惰的值:

object Field {
  lazy val height = // code to find height
  lazy val width = // code to find width
}

val将在第一次使用时初始化,所以只要你没有使用它们,直到你拥有初始化它们所需的所有信息,你应该是好的。