Katakanlah saya memiliki kelas kasus yang mewakili kepribadian, orang-orang di jejaring sosial yang berbeda. Contoh-contoh dari kelas tersebut sepenuhnya tidak dapat diubah, dan disimpan dalam koleksi yang tidak dapat diubah, untuk akhirnya dimodifikasi oleh aktor Akka.
Sekarang, saya memiliki kelas kasus dengan banyak bidang, dan saya menerima pesan yang mengatakan saya harus memperbarui salah satu bidang, seperti ini:
case class Persona(serviceName : String,
serviceId : String,
sentMessages : Set[String])
// Somewhere deep in an actor
val newPersona = Persona(existingPersona.serviceName,
existingPersona.serviceId,
existingPersona.sentMessages + newMessage)
Perhatikan saya harus menentukan semua bidang, meskipun hanya satu perubahan. Apakah ada cara untuk mengkloningPersona yang ada dan mengganti hanya satu bidang, tanpa menentukan semua bidang yang tidak berubah? Bisakah saya menulis itu sebagai sifat dan menggunakannya untuk semua kelas kasus saya?
Jika Persona adalah contoh mirip Peta, itu akan mudah dilakukan.
copy
metode jika dia menyatakan acase class
.Sejak 2.8, kelas kasus Scala memiliki
copy
metode yang memanfaatkan param bernama / default untuk mengerjakan keajaibannya:Anda juga dapat membuat metode
Persona
untuk menyederhanakan penggunaan:kemudian
sumber
sumber
Pertimbangkan menggunakan
lens
diShapeless
perpustakaan:Selain itu, jika Anda memiliki kelas kasus bersarang ,
getter
dansetter
metode dapat sedikit membosankan untuk menulis. Ini akan menjadi peluang bagus untuk disederhanakan dengan menggunakan perpustakaan lensa.Silakan juga merujuk ke:
sumber
Saya tidak ingin menyertakan perpustakaan besar untuk melakukan lensa rumit yang memungkinkan Anda mengatur nilai jauh di kelas kasus bersarang. Ternyata itu hanya beberapa baris kode di perpustakaan scalaz:
Anda kemudian dapat membuat lensa yang menetapkan nilai bersarang jauh lebih mudah daripada menggunakan fitur salin bawaan. Berikut adalah tautan ke set besar jika lensa rumit yang digunakan perpustakaan saya untuk menetapkan nilai yang sangat bersarang.
sumber