как скопировать класс внутри состояния? - PullRequest
0 голосов
/ 17 марта 2020

Это довольно просто, если все значения в State имеют базовый c тип данных. если мы хотим скопировать определенное значение c внутри него, оно будет просто

copy(specificValue = newValue)

, но как, если это указанное значение c находится внутри класса? это то, что я пробовал, но безрезультатно

copy(specificClass.specificValue = newValue)

я должен вместо этого создать / скопировать этот класс снаружи, а затем сделать его как ниже?

copy(specificClass = newClass)

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

если у вас есть


case class Address(street: String, city: String)
case class User(address: Address, name: String)

val u = User(...)

//to change the city to something else you would do

val another = u.copy(address = u.address.copy(city = "New York") 

Это громоздко. Я рекомендую использовать библиотеку quicklens, которая позволит вам написать:


 import com.softwaremill.quicklens._

 val another = u.modify(_.address.city).setTo("New York")
2 голосов
/ 17 марта 2020

Вот проект с именем quicklens

import com.softwaremill.quicklens._

case class Street(name: String)
case class Address(street: Street)
case class Person(address: Address, age: Int)

val person = Person(Address(Street("1 Functional Rd.")), 35)

val p2 = person.modify(_.address.street.name).using(_.toUpperCase)
val p3 = person.modify(_.address.street.name).setTo("3 OO Ln.")

// or

val p4 = modify(person)(_.address.street.name).using(_.toUpperCase)
val p5 = modify(person)(_.address.street.name).setTo("3 OO Ln.")
...