你如何定义在斯卡拉主构造一个局部变量/ VAL?你如何定义在斯卡拉主构造一个局部变量/ VAL?(H

2019-06-12 06:06发布

在Scala中,一个类的主构造没有明确的身体,而是从类体隐式定义。 那么,如何就一个字段和本地值之间区分(即重视本地的构造方法)?

例如,采取下面的代码段,从“Scala中编程”一些示例代码的修改形式:

class R(n: Int, d: Int) {
   private val g = myfunc
   val x = n / g
   val y = d / g
}

我的理解是,这将产生三个字段类:私人“G”,和公众的“X”和“Y”。 然而,G值仅用于x和y场的计算中,和没有任何意义超出构造范围。

因此,在这个(诚然人工)例如,你怎么去定义这个构造局部值?

Answer 1:

class R(n: Int, d: Int) {
  val (x, y) = {
    val g = myfunc
    (n/g, d/g)
  }
}


Answer 2:

有几个方法可以做到这一点。 您可以私有定义内声明这样的临时变量,在施工时使用。 您可以使用其内部返回表达式(如Alaz的答案)块的临时变量。 或者,最后,你可以使用替代构造中这些变量。

在类似构造交替的方式,你也可以在对象的同伴的“应用”方法中定义它们。

什么,你不能做的是声明字段设置为“临时”。

还需要注意的是由主构造接收到的任何参数是一个字段也。 如果你不希望这样的参数成为领域,不希望暴露在构造实际领域,通常的解决办法是让主构造私有的,与实际领域,并请使用一个可选的构造或对象的同伴的申请()作为有效的“初级”的构造。



Answer 3:

我们有另一种选择是使主对象构造私人和使用一个同伴对象的应用方法作为一个建设者。 如果我们将(双关语无意)这种方法您例如,它看起来就像这样:

class R private (val x: Int, val y: Int);

object R {
  def apply(n: Int, d: Int): R = {
    val g = myfunc;
    new R(n / g, d / g);
  }
}

为了代替创建的R实例:

val r = new R(1, 2);

写:

val r = R(1, 2);

这是一个有点冗长,但它可能会更糟,我觉得:)。 让我们希望私人[这]瓦尔斯将在斯卡拉的未来版本的临时变量处理。 马丁本人暗示。



Answer 4:

关于这个话题,包括马丁·奥德斯基的评论一些讨论,是这里



文章来源: How do you define a local var/val in the primary constructor in Scala?