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

Scala构造函数,默认参数引用另一个参数,scala,constructor,Scala,Constructor,我想让第二个构造函数参数成为可选的,并在这种情况下使用第一个参数的值。我有办法做到吗?此代码无法编译,因为它找不到realUser: class CurrentUser(val realUser:String, val masqueradeUser:String = realUser) 我相信我可以通过编写自己的构造函数来解决这个问题,但我想知道是否有更简洁的方法。事实上,现在我已经试着编写自己的构造函数了,它并没有那么糟糕: class CurrentUser(val realUser:St

我想让第二个构造函数参数成为可选的,并在这种情况下使用第一个参数的值。我有办法做到吗?此代码无法编译,因为它找不到
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)
}

如果有人能想出一些短而好的方法,否则我会发布我自己的答案。

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

class CurrentUser(val realUser: String)(val masqueradeUser: String = realUser)
然后打电话给我

new CurrentUser(real)()

不太好。

不能将同一参数列表中的参数作为默认参数重用。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]
类。无论如何,我还是会选择你的第二个构造函数解决方案。

谢谢你的建议。我想我会坚持手动指定第二个构造函数表单。为了完整起见,这是一个答案

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

酷-我以前从未真正使用过多个参数列表。你是对的,也许这不是使用它们的地方:)