2013-06-25 2 views
0

Скажем, у меня есть класс, в Scala:Клонирование экземпляр класса, но не совсем

class Class123(val val1: Int, val val2: String, val val3: AnotherClass, val val4: AnotherClass2) 

//I create Class123 somehow, it doesn't matter how exactly 
val class123_1: Class123 = parseClass123() 

А теперь я хочу, чтобы создать еще один экземпляр Class123 точно так же, как class123_1 за исключением последнего параметра val4, Я хочу, чтобы он был другим:

val class123_2 = // the same as class123_1 but with different last parameter val4 

Как это сделать?

ответ

2

Вы можете сделать это с помощью тематического класса и указав параметр, чтобы изменить имя.

val class123 = new Class123(...) 
val copy = class123.copy(val4 = ...) 

Это было представлено в Scala 2.8, и есть more info here.

+0

Кстати, он не использует класс case, есть ли способ сделать это? –

+0

@MariusKavansky: Вы можете определить такой метод самостоятельно. Класс Case предоставляет вам автогенерированную реализацию. – senia

2

Turn класса к классу корпуса:

scala> case class Class123(val val1: Int, val val2: Int, val val3: Int, val val4: Int) 
// defined class Class123 

scala> val foo = Class123(1,2,3,4) 
// foo: Class123 = Class123(1,2,3,4) 

scala> val bar = foo.copy(val4 = -4) 
// bar: Class123 = Class123(1,2,3,-4) 
2

Существует уже метод copy всего case class es.

Вы должны просто определить свой класс как случай класса:

case class Class123(val1: Int, val2: String, val3: AnotherClass, val4: anotherClass2) 

val c1: Class123 = ??? 
val c2 = c1.copy(val4 = newValue) 

Вы могли бы определить такой метод себя, если вы не хотите, чтобы ваш класс тематическое класс:

class Class123(val val1: Int, val val2: String, val val3: AnotherClass, val val4: anotherClass2) { 
    def copy(val1: Int = val1, val2: String = val2, val3: AnotherClass = val3, val4: anotherClass2 = val4) = 
    new Class123(val1, val2, val3, val4) 
} 
2

Jay шатуны описывает метод here a copyWith, основанный на отражении, подходящий также для «классов без случайностей». Вы можете использовать его черту как смесь для любого класса.