Scala копировать объекты - PullRequest
14 голосов
/ 11 ноября 2011

Есть ли способ сделать копию объекта (или даже лучше список объектов)? Я говорю о пользовательских объектах классов, которые могут быть расширены другими классами.

пример:

class Foo() {
   var test = "test"
}

class Bar() extends Foo {
   var dummy = new CustomClass()
}

var b = new Bar()
var bCopy = b.copy() // or something?

1 Ответ

21 голосов
/ 11 ноября 2011

В Java они пытались решить эту проблему методом clone, который работает, вызывая clone во всех суперклассах, но обычно это считается неработоспособным и его лучше избегать, по причинам, которые вы можете посмотреть (например, здесь ).

Так что в Scala, как обычно в Java, вам придется создавать собственный метод копирования для произвольного класса, который позволит вам указывать такие вещи, как глубокое или мелкое копирование полей.

Если вы сделаете свой класс case class, вы получите copy метод бесплатно. Это на самом деле лучше, потому что вы можете обновить любое из полей одновременно:

case class A(n: Int)
val a = A(1)         // a: A = A(1)
val b = a.copy(a.n)  // b: A = A(1) 
val c = a.copy(2)    // c: A = A(2)

Однако наследование от case-классов устарело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...