2
class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
}

オブジェクトを作成するときに、プライマリコンストラクター引数からnamesBufferフィールドにnames配列の名前を追加するにはどうすればよいのでしょうか。そのために補助コンストラクターを作成する必要がありますか、それともプライマリコンストラクターで操作を行うようにScalaに指示する別の方法がありますか?

注:上記の例は架空のものです。フィールドを割り当てるよりも多くの操作を実行するようにプライマリコンストラクターに指示する方法を知りたいだけです。

4

3 に答える 3

3

axel22 の回答が示すように、これらの操作はクラス本体のどこでも実行できます。

しかし、単一の式でフィールドを完全に初期化することは、IMO の良い習慣です。

副作用が必要な場合は、中括弧を使用してブロックを作成できます。これは、最後の行の値を持つ式です。

class A(names: String*) {
  val namesBuffer: ListBuffer[String] = {
    val buffer = new ListBuffer[String]
    buffer ++= names
    buffer
  }
}

namesBufferこの手法を使用すると、初期化を完了する前に、他の初期化ロジックが の値にアクセスしないようにすることができます。

于 2012-06-21T22:14:40.323 に答える
3

クラス定義の本体のすべてのステートメントは、既定のコンストラクターの本体の一部になります。

あなたの例では、次のことができます:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
  namesBuffer ++= names
}

またはそれより短い:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String] ++= names
}

また:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = ListBuffer[String](names: _*)
}
于 2012-06-21T21:41:54.127 に答える
0

Scala では、意味がある場合、クラス定義全体が実質的にデフォルトのコンストラクターです。

次のようなことができます。

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
  namesBuffer.add(names)
}

文字列配列を取る場合は、names バッファを初期化することもできます。

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String](names)
}
于 2012-06-21T21:38:49.937 に答える