2012-03-25 7 views
33

Spójrz na ten przykład:Jak ujawnić argumenty konstruktora Scala jako członków publicznych?

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 
    } 
} 

Jak widać Chcę zdefiniować metodę + operatora na klasy Point. Ale to nie będzie działać ponieważ w tej metodzie, x i y mogą nie być dostępne na zmiennej lokalnej w sourcePoint ponieważ są prywatne, więc zmieniłem na ten przykład:

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) 
    } 
} 

To oczywiście działa, jednak jest łatwiejszy sposób na zdefiniowanie tych zmiennych zamiast przechodzenia z _x -> x i _y -> y.

Dzięki za pomoc i czas! :)

+5

Kiedy piszesz 'klasa punkt (x: Podwójne, y: Double)', '' y' x' i są tylko parametry dla głównego konstruktora, a nie fileds w klasie. Aby uczynić je polami klasy, potrzebujesz 'val' lub' var'. – markmarch

+0

Aight, thanks! Wydaje się oczywiste teraz haha;) – user1285925

+1

To jest trochę OT, ale nie używaj wyraźnego zwrotu w swojej metodzie "+", jawne zwroty w scala są tłumaczone na wyjątek, który jest wyrzucany i bezpośrednio przechwytywany, a następnie wynik jest zwracany. Używaj tego tylko do wybijania zamknięć. – drexin

Odpowiedz

58

Tak, jest:

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

Czuję się zawstydzony. Powinienem odrobić zadanie domowe, jak mógłbym to pominąć: P – user1285925

+0

@ user1285925 Jeśli chcesz zachować 'x' i' y' jako prywatne, musisz dodać 'private' przed każdym' val' na liście argumentów konstruktora. –

+0

@LeifWickland Czy jest jakiś powód, aby zadeklarować 'private val' na liście argumentów? Możesz po prostu go opuścić, a kompilator sprawi, że będzie to pole w razie potrzeby. –

3

użyciu val jest ważna, ale to parametr staje się ostateczna (stała). Jeśli chcesz mieć możliwość ponownego przypisania wartości, powinieneś zamiast tego użyć var. Więc

class Point(var x: Int, var y: Int) 
Powiązane problemy