Ваша путаница связана с разницей между variables
и values
.
Итак, когда вы делаете что-то вроде,
val p1 = Person("amit", "shah")
val p2 = p1.copy()
Тогда p2
- это мелкая копияp1
, поэтому variables
p1.firstname
и p2.firstname
указывают на один и тот же тип value
типа String
, который "amit"
.
Когда вы делаете p1.firstname = "raghu"
, выфактически говоря переменной p1.firstname
указать на другой value
типа String
, который является "raghu"
.Здесь вы изменяете не само значение, а variable
.
. Если вы измените само значение value
, то и p1
, и p2
будут отражать это изменение.К сожалению, значения String
неизменны в Scala, поэтому вы не можете изменить значение String
.
Позвольте мне показать вам, используя что-то изменяемое, например ArrayBuffer
.
scala> import scala.collection.mutable.ArrayBuffer
// import scala.collection.mutable.ArrayBuffer
scala> case class A(s: String, l: ArrayBuffer[Int])
// defined class A
scala> val a1 = A("well", ArrayBuffer(1, 2, 3, 4))
// a1: A = A(well,ArrayBuffer(1, 2, 3, 4))
scala> val a2 = a1.copy()
// a2: A = A(well,ArrayBuffer(1, 2, 3, 4))
// Lets modify the `value` pointed by `a1.l` by removing the element at index 1
scala> a1.l.remove(1)
// res0: Int = 2
// You will see the impact in both a1 and a2.
scala> a1
// res1: A = A(well,ArrayBuffer(1, 3, 4))
scala> a2
//res2: A = A(well,ArrayBuffer(1, 3, 4))