我想使第二个构造函数参数可选,并在这种情况下使用第一个参数的值.有什么方法可以做到吗?此代码无法编译,因为它找不到realUser
:
class CurrentUser(val realUser:String, val masqueradeUser:String = realUser)
Run Code Online (Sandbox Code Playgroud)
我确信我可以通过编写自己的构造函数来解决它,但我想知道是否有更简洁的方法.实际上现在我已经尝试编写自己的构造函数了,它并没有那么糟糕:
class CurrentUser(val realUser:String, val masqueradeUser:String) {
def this(realUser:String) = this(realUser, realUser)
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以提出更短的东西,那么我会发布自己的答案.
Did*_*ont 11
我相信你的辅助构造函数的解决方案是更好的.参数在其自己的参数列表中不可见,仅在以下参数中可见.所以你必须这样做
class CurrentUser(val realUser: String)(val masqueradeUser: String = realUser)
Run Code Online (Sandbox Code Playgroud)
然后打电话给
new CurrentUser(real)()
Run Code Online (Sandbox Code Playgroud)
不太好.
您不能将同一参数列表中的参数重用为默认参数.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
Run Code Online (Sandbox Code Playgroud)
如果你想避免null
,你可以使用这里讨论的Opt[A]
类,如果你不介意开销.无论如何,我仍然会使用你的第二个构造函数解决方案.
谢谢你的建议.我想我会坚持手动指定第二个构造函数表单.这是为了完整性的答案.
class CurrentUser(val realUser:String, val masqueradeUser:String) {
def this(realUser:String) = this(realUser, realUser)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
264 次 |
最近记录: |