2011-10-20 11 views
8

Chciałbym uczynić drugi argument konstruktora opcjonalnym i użyć wartości pierwszego argumentu w tym przypadku. Czy mogę to zrobić? Ten kod nie skompilować, ponieważ nie może znaleźć realUser:Konstruktor Scala z domyślnym argumentem odnoszącym się do innego arg

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

Jestem pewien, że może obejść pisząc własne konstruktora, ale zastanawiałem się, czy nie było bardziej zwięzły sposób. Właściwie teraz, że próbowałem pisać własne konstruktora, to nie jest tak źle:

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

Jeśli ktoś może wymyślić coś krótszego to świetnie, w przeciwnym razie będę pisać własną odpowiedź.

Odpowiedz

5

Dzięki za sugestie. Myślę, że pozostanę przy ręcznym określaniu drugiego formularza konstruktora. Tutaj jest jako odpowiedź dla kompletności.

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

Uważam, że twoje rozwiązanie z pomocniczym konstruktorem jest lepsze. Parametr nie jest widoczny na liście własnych parametrów, tylko w poniższych. Więc trzeba by zrobić

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

a następnie zadzwonić z

new CurrentUser(real)() 

Niezbyt miłe.

+0

Fajnie - nigdy wcześniej nie używałam wielu list parametrów. Masz rację, że być może to nie jest miejsce do ich wykorzystania :) – Nick

8

Nie można ponownie użyć parametrów z tej samej listy parametrów, co domyślne argumenty. Rozwiązanie didierd działa, a prawdopodobnie Twoje rozwiązanie z drugim konstruktorem jest najbardziej eleganckie. Oto trzecia możliwość, która wykorzystuje bał 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 

Jeśli chcesz uniknąć null, można użyć klasy discussed hereOpt[A] jeśli nie przeszkadza narzutu. Tak czy inaczej, nadal będę korzystał z twojego rozwiązania drugiego konstruktora.

Powiązane problemy