2

class Foo() {
 val array  // how do I leave initialization till later?
 def initializeArray(size : Int) = array = Array.ofDim[Int](size)
}

上面的代码不会编译,那么以后如何初始化我的数组呢?

编辑

假设我需要读取一个包含整数矩阵的文件,并且我想将矩阵表示为二维数组。当然,我正在解析Foo类中的文件,并且在解析完成之前不会知道矩阵的维度。

4

2 回答 2

4

你可以使用一个惰性值,例如

scala> class Foo {
     | lazy val array = initialize
     | def initialize = {
     | println("initializing...")
     | new Array[Int](5)
     | }
     | }
defined class Foo

scala> val f = new Foo
f: Foo = Foo@135810c

scala> f.array
initializing...
res46: Array[Int] = Array(0, 0, 0, 0, 0)

现在你已经推迟了数组初始化的时间。

于 2012-04-14T13:37:13.073 回答
3

一种简单的方法是将其初始化为null. 为此,您需要指定一个类型,Array[Int]并使其成为var(而不是val),以便您以后可以更改它:

class Foo() {
  var array: Array[Int] = null  // how do I leave initialization till later?
  def initializeArray(size : Int) = array = Array.ofDim[Int](size)
}

但是,这在 Scala 中并不是很好的做法。最好使用一个Option

class Foo() {
  var array: Option[Array[Int]] = None  // how do I leave initialization till later?
  def initializeArray(size : Int) = array = Some(Array.ofDim[Int](size))
}

这明确地告诉用户,它array可能不会被设置为任何东西,并避免NullPointerExceptions。您可以在 StackOverflow 或其他地方阅读更多信息Option

最后,Scala 中最好的设计依赖于不可变类。在这种情况下,您将推迟创建,Foo直到您真正知道要放入其中的内容。但是,在不了解您的设计的任何其他信息的情况下,很难说如何最好地进行设置。

编辑:根据您的描述,我会将您的设计分为两部分:用于解析文件的方法和Foo用于存储最终结果的不可变对象。

class Foo(array: Array[Int]) {

}

object Foo {
  def fromFile() = {
     val array: Array[Int] = /* parse file into the right structure */
     new Foo(array)
  }
}

然后你可以说:

val foo = Foo.fromFile(filename)

foo将是一个完整的、不可变的Foo.

于 2012-04-14T02:18:42.823 回答