/ / Dlaczego metoda kopiowania klasy sprawy Scala sparametryzowana tylko ze zmiennymi zdefiniowanymi w klasie sprawy? - scala

Dlaczego metoda kopiowania klas Scala sparametryzowana jest tylko ze zmiennymi zdefiniowanymi w klasie przypadku? - scala

Dlaczego metoda kopiowania klasy sprawy Scala sparametryzowana tylko przy pomocy zmiennych zdefiniowanych w klasie sprawy?

Pytanie oparte na pytaniach i odpowiedziach:

Kopia klasy sprawy nie zachowuje stanu odziedziczonej cechy

Krótkie podsumowanie - gdy cecha jest zdefiniowana za pomocą pola i rozszerzona o klasę obserwacji, copy na klasie przypadków utworzy nową instancję klasy tylko ze zmiennymi zdefiniowanymi w klasie przypadków, bez cechy rozszerzonej.

 trait A {
var list: List[Int] = List()

def add(element: Int) = {
list = element :: list
}
}

case class B(str: String) extends A {
val b = B("foo")
println("B1: " + b.list)

b.add(1)
b.add(2)
b.add(3)
println("B2: " + b.list)

val b2 = b.copy(str = "bar")
println("B3: " + b.list)
println("B4: " + b2.list)
}

Tutaj, B4: () będzie pusty B3:(3,2,1)

Odpowiedzi:

2 dla odpowiedzi № 1

Ponieważ nie ma rozsądnego sposobu na robienie tego, co chcesz konsekwentnie.

Na przykład wygenerowany kod dla copy możliwe

def copy(str: String = this.str, list: List[Int] = this.list): B = {
val newB = B(str)
newB.list = list
newB
}

Wystarczająco dobry. Co się stanie, jeśli się zmienisz? list być prywatnym, lub val zamiast var? W obu przypadkach newB.list = ... nie skompilowałem, więc jaki kod powinien wygenerować kompilator?


0 dla odpowiedzi nr 2

Jeśli naprawdę chcesz zachować wartość list po skopiowaniu (biorąc pod uwagę problem ze zmiennością, o którym wspomniałem w komentarzach OP), możesz napisać własny copy metoda.

case class B(str: String) extends A {
def copy(str: String = this.str, list: List[Int] = this.list): B = {
val newB = B(str)
list.reverse.foreach(newB.add)
newB
}
}