2

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

上記のコードはコンパイルされません。後で配列を初期化するにはどうすればよいですか?

編集

整数の行列を含むファイルを読み取る必要があり、その行列を 2 次元配列として表現したいとします。もちろん、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

簡単な方法の 1 つは、初期化して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))
}

これは、 が何にも設定されていない可能性があることをユーザーに明示的に伝え、 sarrayを回避しNullPointerExceptionます。Option詳細については、StackOverflow または他の場所で読むことができます。

最後に、Scala での最良の設計は不変クラスに依存しています。そのような場合、Foo何を入れたいかが実際にわかるまで、 の作成を延期します。ただし、設計について他に何も知らなければ、これをどのようにセットアップするのが最善かを言うのは困難です.

編集:あなたの説明に基づいて、私はあなたのデザインを2つの部分に分けます.ファイルを解析する方法と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 に答える