Oto kawałek kodu, który działa dobrze -
Teraz moje pytanie brzmi - czy zadeklaruję argument Class Vector
tak jak val
i przypisz nową wartość do Vector v1
lubić v1(1) = 10
- Mam błąd jak error: reassignment to val
.
Aby tego uniknąć, zmieniam typ argumentu var
od val
. Do tej pory rozumiem pojęcie jako deklarujące argumenty jako val
, Class
staje się niezmienny i nie mogę przypisać nowej wartości do val
.
Moje zamieszanie powstaje nawet ja deklaruję var
jako typ argumentu nadal nie mogę zaktualizować wartości vector v1
lub v2
. Muszę mieć inny method
, def update
zaktualizować wartość Vector v1 or v2
. Dlaczego tak?
Aktualizacja wartości nie jest tym samym, co ponowne przypisanie wartości lub odwrotnie. Bez def update method
Wystąpił błąd jako error: value update is not a member of this.Vector
.
Jakiej koncepcji mi brakuje?
class Vector(var x: Double, var y: Double, var z: Double) {
def +(v: Vector) = new Vector(x+v.x, y+v.y, z+v.z)
def -(v: Vector) = new Vector(x-v.x, y-v.y, z-v.z)
def dot(v: Vector) = x*v.x + y*v.y + z*v.z
def cross(v: Vector) = new Vector(
y*v.z - z*v.y,
z*v.z - x*v.z,
x*v.y - y*v.x)
def apply(index: Int): Double = index match {
case 0 => x
case 1 => y
case 2 => z
}
def update(index: Int, value: Double): Unit = index match {
case 0 => x = value
case 1 => y = value
case 2 => z = value
}
def printForm: String = "("+x+", "+y+", "+z+")"
}
val v1 = new Vector(1,2,4)
val v2 = new Vector(2,3,5)
println("+ " + (v1+v2).printForm)
println("- " + (v1-v2).printForm)
println(v1(0))
v1(1) = 10
println(v1(1))
Odpowiedzi:
2 dla odpowiedzi № 1Rzeczą do zrealizowania jest v1(1) = 10
, to jest naprawdę cukier składniowy v1.update(1, 10)
.
To nie tylko dla twojego typu Kolekcje Scala pracować w ten sposób.
Więc kiedy piszesz v1(1) = 10
, kompilator będzie narzekał, jeśli nie masz update
metoda zdefiniowana dla twojej klasy.
Jeśli chcesz po prostu aktualizować swoje wektory, nic nie stoi na przeszkodzie, abyś po prostu to zrobił v1.x = 10
, tak długo jak x
zadeklarowano za pomocą var
i nie jest chroniony ani prywatny.