2011-10-20 20 views
8

Me gustaría hacer que el segundo argumento constructor sea opcional, y usar el valor del primer argumento en ese caso. ¿Hay alguna manera de que pueda hacer eso? Este código no se compila ya que no puede encontrar realUser:Constructor Scala con arg predeterminado que hace referencia a otro arg

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

Estoy seguro de que puede trabajo alrededor de ella escribiendo mi propio constructor, pero me preguntaba si había una manera más concisa. En realidad, ahora que lo he intentado escribir mi propio constructor, no es tan malo:

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

Si alguien puede llegar a algo más corto, entonces genial, de lo contrario voy a publicar mi propia respuesta.

Respuesta

5

Gracias por las sugerencias. Creo que me limitaré a especificar manualmente el segundo formulario de constructor. Aquí es como una respuesta por el bien de la completud.

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

Creo que su solución con el constructor auxiliar es la mejor. Un parámetro no es visible en su propia lista de parámetros, solo en los siguientes. Por lo que tendría que hacer

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

y luego llamar con

new CurrentUser(real)() 

No muy agradable.

+0

Genial: nunca antes había utilizado múltiples listas de parámetros. Estás en lo correcto de que quizás este no sea el lugar para usarlos :) – Nick

8

No se pueden reutilizar los parámetros de la misma lista de parámetros como argumentos predeterminados. La solución de didierd funciona, y probablemente su solución con un segundo constructor sea la más elegante. Aquí hay una tercera alternativa, que utiliza el temido 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 

Si se quiere evitar null, puede utilizar la clase discussed hereOpt[A] si no te importa la sobrecarga. De una forma u otra, aún seguiría con tu solución de segundo constructor.

Cuestiones relacionadas