15.3. Kopiowanie instancji klas przypadku
Jeśli klasa przypadku nie definiuje, ani nie dziedziczy składowej o nazwie copy, to dodawana jest do niej definicja metody copy, która pozwala tworzyć kopie instancji klasy, jednocześnie umożliwiając ustawienie nowych wartości wybranych elementów. Lista parametrów tej metody odpowiada liście elementów klasy przypadku, z argumentami domyślnymi równymi wartościom elementów kopiowanej instancji. Wywołując metodę copy możemy uwzględnić te elementy, którym chcemy nadać nowe wartości w kopii, a pominąć pozostałe.
Plik CaseClassE.scala: case class E(a:Int, b:String, c:Long)
Poniższe polecenia pokazują tworzenie nowych instancji klasy E, zdefiniowanej w pliku CaseClassE.scala, na podstawie instancji e1. Instancja e2 jest kopią instancji e1, utworzoną przez wywołanie metody copy z pustą listą parametrów. Instancja e3 jest kopią e1 ze zmienioną wartością pierwszego elementu. Instancja e4 jest kopią e1 ze zmienionymi wartościami elementów a i c.
scala> val e1 = new E(1,"e1",2L) e1: E = E(1,e1,2) scala> val e2 = e1.copy() e2: E = E(1,e1,2)
scala> e1 eq e2 res0: Boolean = false scala> val e3 = e1.copy(4) e3: E = E(4,e1,2) scala> val e4 = e1.copy(c=4L, a=5) e4: E = E(5,e1,4)
Metoda copy nie jest tworzona jeśli klasa ma parametr powtórzony.
scala> case class E2(a: Int*)
defined class E2
scala> val e5 = E2(1,2)
e5: E2 = E2(WrappedArray(1, 2))
scala> e5.copy()
<console>:14: error: value copy is not a member of E2
e5.copy()
^
Plik CaseClassE.scala:
case class E(a:Int, b:String, c:Long)
