/ / Защо методът на скалата на случай на скала се копира параметризирано само с променливите, дефинирани в класа случай? - скала

Защо методът за копиране на случаите на Scala се параметризира само с променливите, дефинирани в класа на делата? - скала

Защо метода на копиране на казус от Scala се параметризира само с променливите, дефинирани в класа случай?

Въпросът, който се основава на въпросите с въпроси и отговори:

Копие от клас на случай не поддържа състояние на наследена черта

Кратко обобщение - когато характеристиката се дефинира с поле и се разширява от клас по случай, copy в случая клас ще създаде новия клас инстанция само с променливи, дефинирани в случай клас, без разширена черта.

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

Тук, B4: () ще бъде празно, докато B3:(3,2,1)

Отговори:

2 за отговор № 1

Защото няма разумен начин да правите това, което искате последователно.

За вашия пример генериран е код за copy може да бъде

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

Достатъчно добър. Сега какво ще стане, ако се промениш list да бъде частно, или a val вместо a var? И в двата случая newB.list = ... няма да се компилира, така че какъв код да генерира компилаторът?


0 за отговор № 2

Ако наистина искате да запазите стойността на list след копиране (като се има предвид въпросът за променливостта, който споменах в коментарите на ОП), можете да напишете своя собствена copy метод.

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