2011-10-20 17 views
8

Vorrei rendere facoltativo il secondo argomento del costruttore e utilizzare il valore del primo argomento in quel caso. C'è un modo per farlo? Questo codice non può essere compilato in quanto non riesce a trovare realUser:Costruttore di scala con arg default che fa riferimento ad un altro argomento

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

Sono sicuro che posso lavoro intorno ad esso per scrivere il mio costruttore, ma mi chiedevo se ci fosse un modo più conciso. In realtà ora che ho provato a scrivere il mio costruttore, non è poi così male:

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

Se qualcuno può venire con qualcosa di più breve poi grande, altrimenti vi posto la mia risposta.

risposta

5

Grazie per i suggerimenti. Penso che continuerò a specificare manualmente il secondo modulo costruttore. Qui è come una risposta per l'amor di completezza.

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

Credo che la soluzione con il costruttore ausiliario sia la migliore. Un parametro non è visibile nel proprio elenco di parametri, solo nei seguenti. Così si dovrebbe fare

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

e quindi chiamare con

new CurrentUser(real)() 

Non troppo bello.

+0

Cool: non ho mai utilizzato più elenchi di parametri. Hai ragione che forse questo non è il posto giusto per usarli però :) – Nick

8

Non è possibile riutilizzare i parametri dallo stesso elenco di parametri come argomenti predefiniti. la soluzione di didierd funziona, e probabilmente la tua soluzione con un secondo costruttore è la più elegante. Ecco una terza alternativa, che utilizza il temuto 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 

Se si vuole evitare null, è possibile utilizzare la classe di Opt[A]discussed here se non ti dispiace l'overhead. In un modo o nell'altro, mi piacerebbe ancora andare con la soluzione del secondo costruttore.

Problemi correlati