2011-10-20 26 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]類,如果你不介意的開銷。無論如何,我仍然會選擇第二個構造解決方案。

相關問題