Конструктор Scala с аргументом по умолчанию, ссылающимся на другой аргумент - PullRequest
8 голосов
/ 20 октября 2011

Я хотел бы сделать второй аргумент конструктора необязательным и использовать значение первого аргумента в этом случае. Есть ли способ, которым я могу это сделать? Этот код не компилируется, так как не может найти realUser:

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

Я уверен, что могу обойти это, написав свой собственный конструктор, но мне было интересно, есть ли более краткий способ. На самом деле, теперь, когда я попытался написать свой собственный конструктор, все не так плохо:

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

Если кто-то может придумать что-то более короткое, чем великое, иначе я выложу свой собственный ответ.

Ответы [ 3 ]

11 голосов
/ 20 октября 2011

Я считаю, что ваше решение с помощью вспомогательного конструктора является лучшим.Параметр не отображается в собственном списке параметров, только в следующих.Так что вам нужно будет сделать

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

, а затем позвонить с

new CurrentUser(real)()

Не слишком приятно.

8 голосов
/ 20 октября 2011

Вы не можете повторно использовать параметры из того же списка параметров, что и аргументы по умолчанию. Решение 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, вы можете использовать Opt[A] класс , обсуждаемый здесь , если вы не возражаете против накладных расходов. Так или иначе, я бы все же выбрал ваше решение для второго конструктора.

5 голосов
/ 20 октября 2011

Спасибо за предложения. Я думаю, что я буду придерживаться указания второй формы конструктора вручную. Вот как ответ для полноты картины.

class CurrentUser(val realUser:String, val masqueradeUser:String) {
    def this(realUser:String) = this(realUser, realUser)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...