你如何在Scala的主构造函数中定义一个本地var / val?

在Scala中,一个类的主要构造函数没有明确的主体,但是从类主体隐式定义。 那么,如何区分字段和本地值(即构造函数方法的本地值)呢?

例如,采取下面的代码片段,一个从“Programming in Scala”中的一些示例代码的修改forms:

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

我的理解是这将产生一个有三个领域的类:一个私有的“g”,以及公共的“x”和“y”。 但是,g值只用于计算x和y字段,超出构造函数范围没有意义。

所以在这个(不可否认的)例子中,你如何去为这个构造函数定义本地值呢?

例如

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

有几种方法可以做到这一点。 您可以在私有定义中声明这样的临时variables,以便在施工期间使用。 您可以在返回expression式的块内使用临时variables(例如在Alaz的回答中)。 或者,最后,你可以在交替的构造函数中使用这样的variables。

以类似于替代构造函数的方式,您也可以在对象伴随的“apply”方法中定义它们。

不能做的是宣布一个字段是“临时”的。

还要注意,主构造函数接收的任何参数也是一个字段。 如果你不想让这些参数成为字段,也不想在构造函数中公开实际的字段,通常的解决scheme是使主构造函数为私有的,实际的字段,并使用替代构造函数或object-companion的apply()作为有效的“主”构造函数。

我们拥有的另一个select是使主对象构造函数保持私有,并使用伴随对象的apply方法作为构build器。 如果我们应用(双关不打算)这个方法在你的例子中看起来像这样:

 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); } } 

要创build一个R实例,而不是:

 val r = new R(1, 2); 

写:

 val r = R(1, 2); 

这有点冗长,但可能会更糟,我想:)。 让我们希望在今后的Scala版本中将私有的这个值视为临时variables。 马丁本人暗示说。

关于这个话题的一些讨论,包括Martin Odersky的评论在这里