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

我想知道,如何在创建对象时将 names 数组的名称从主构造函数参数添加到 namesBuffer 字段?我是否必须创建一个辅助构造器才能这样做,还是有另一种方法告诉 Scala 在主构造器中执行操作?

注意:上面的例子是虚构的,我只是想知道,我怎样才能告诉主构造函数做一些比分配字段更多的操作。

4

3 回答 3

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 回答
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 回答
0

在 Scala 中,如果有意义的话,整个类定义实际上是默认构造函数。

你可以这样做:

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

如果它采用字符串数组,您还可以初始化名称缓冲区:

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