/ / Różnica między ponownym przypisaniem a aktualizacją argumentu w Scala - scala, var

Różnica między ponownym przypisaniem a aktualizacją argumentu w Scala - scala, var

Oto kawałek kodu, który działa dobrze -

Teraz moje pytanie brzmi - czy zadeklaruję argument Class Vector tak jak vali przypisz nową wartość do Vector v1 lubić v1(1) = 10 - Mam błąd jak error: reassignment to val.

Aby tego uniknąć, zmieniam typ argumentu varod 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 № 1

Rzeczą 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.