你如何在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的评论在这里