Scala在方法中初始化类级别的Array变量

时间:2012-04-14 02:15:25

标签: arrays scala


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

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

修改

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

2 个答案:

答案 0 :(得分: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)

现在,您已在数组初始化时延迟。

答案 1 :(得分: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可能没有设置为任何内容,并且避免NullPointerException。您可以在StackOverflow或其他地方阅读有关Option的更多信息。

最后,Scala中最好的设计依赖于 immutable 类。在这种情况下,您将推迟创建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