2011-10-20 27 views
8

我想让第二个构造函数参数为可选,并在这种情况下使用第一个参数的值。有什么办法可以做到吗?此代码不能编译,因为它无法找到realUserScala构造函数与默认arg引用另一个arg

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

我敢肯定,我可以解决它写我自己的构造函数,但我不知道是否有一个更简洁的方式。其实现在我已经试着写我自己的构造,它并不坏:

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

如果有人能想出一些更短的再大,否则我会后我自己的答案。

回答

5

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

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

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

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

,然后用

new CurrentUser(real)() 

不算太好看来电。

+0

酷 - 我从来没有真正使用过多个参数列表。你是对的,也许这不是使用它们的地方:) – Nick

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,您可以使用discussed hereOpt[A]类,如果你不介意的开销。无论如何,我仍然会选择第二个构造解决方案。

相关问题