2012-03-25 9 views
33

vistazo a este ejemplo:¿Cómo expongo los argumentos del constructor de Scala como miembros públicos?

class Point(x: Double, y: Double){ 
    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y 
    } 
} 

Como se puede ver quiero definir un método + operador de la clase Point. Pero esto no funcionará porque en ese método, x y y no se puede acceder a la variable local sourcePoint ya que son privadas, por lo que cambió el ejemplo en esto: sin embargo

class Point(_x: Double, _y: Double){ 
    var x = _x 
    var y = _y 

    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y) 
    } 
} 

Eso, obviamente, trabajó, ¿Hay alguna manera más fácil de definir estas variables en lugar de ir desde _x -> xy _y -> y?

¡Gracias por su ayuda y tiempo! :)

+5

Cuando escribe 'clase Point (x: Double, y: Double)', 'x' y' y' son solo parámetros para el constructor primario, no fileds en la clase. Para convertirlos en campos de la clase, necesitas 'val' o' var'. – markmarch

+0

Aight, gracias! Parece obvio ahora jaja;) – user1285925

+1

Esto es un poco OT, pero no use return explícito en su método '+', los retornos explícitos en scala se traducen en una excepción que se lanza y se atrapa directamente y luego se devuelve el resultado. Solo use esto para salir de los cierres. – drexin

Respuesta

58

Sí, se encuentra:

class Point(val x: Int, val y: Int) 
+1

Me siento avergonzado. Debería hacer mejor mi tarea, ¿cómo puedo omitir esto? P – user1285925

+0

@ user1285925 Si quieres mantener 'x' y' y' en privado, necesitarías agregar 'private' antes de cada' val' en la lista de argumentos del constructor. –

+0

@LeifWickland ¿Hay alguna razón para declarar 'val privado 'en la lista de argumentos? Podrías dejarlo fuera y el compilador lo convierte en un campo si es necesario. –

3

utilizando val es válida, pero luego se convierte en el parámetro final (constante). Si desea poder reasignar el valor, debe usar var en su lugar. Entonces

class Point(var x: Int, var y: Int) 
Cuestiones relacionadas