Scala构造函数,默认arg引用另一个arg

时间:2011-10-20 10:15:26

标签: scala constructor

我想使第二个构造函数参数可选,并在这种情况下使用第一个参数的值。有什么方法可以做到吗?此代码无法编译,因为找不到realUser

class CurrentUser(val realUser:String, val masqueradeUser:String = realUser)

我确信我可以通过编写我自己的构造函数来解决它,但我想知道是否有更简洁的方法。实际上现在我已经尝试编写自己的构造函数了,它并没有那么糟糕:

class CurrentUser(val realUser:String, val masqueradeUser:String) {
    def this(realUser:String) = this(realUser, realUser)
}

如果有人可以提出更短的内容,那么我会发布自己的答案。

3 个答案:

答案 0 :(得分:11)

我相信你的辅助构造函数的解决方案更好。参数在其自己的参数列表中不可见,仅在以下参数中可见。所以你必须这样做

class CurrentUser(val realUser: String)(val masqueradeUser: String = realUser)

然后用

打电话
new CurrentUser(real)()

不太好。

答案 1 :(得分:8)

您不能将同一参数列表中的参数重用为默认参数。 didierd的解决方案有效,可能你的第二个构造函数的解决方案是最优雅的。这是第三种选择,它使用了可怕的null

scala> class CurrentUser(val realUser:String, _masqueradeUser: String = null) {
     |   val masqueradeUser = if (_masqueradeUser == null) realUser else _masqueradeUser
     | }
defined class CurrentUser

scala> new CurrentUser("paul").masqueradeUser
res1: String = paul

scala> new CurrentUser("paul", "p").masqueradeUser
res2: String = p

如果您想避免null,如果您不介意开销,可以使用Opt[A]discussed here。无论如何,我仍然会使用你的第二个构造函数解决方案。

答案 2 :(得分:5)

感谢您的建议。我想我会坚持手动指定第二个构造函数表单。这是为了完整性的答案。

class CurrentUser(val realUser:String, val masqueradeUser:String) {
    def this(realUser:String) = this(realUser, realUser)
}