说我有以下两个case classes:
case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, address: Address)
和以下Person类的实例:
val raj = Person("Raj", "Shekhar", Address("M Gandhi Marg", 
                                           "Mumbai", 
                                           "Maharashtra", 
                                           411342))
现在,如果我想更新zipCode,raj那么我将不得不做:
val updatedRaj = raj.copy(address = raj.address.copy(zipCode = raj.address.zipCode + 1))
随着嵌套水平的提高,这将变得更加丑陋.是否有更清洁的方式(像Clojure的东西update-in)来更新这样的嵌套结构?
我有几个类都扩展了相同的特性,并且共享了应该改变其状态的相互功能.但是我想知道是否有更好的方法来实现相同的功能.
例如:
trait Breed
case object Pincher extends Breed
case object Haski extends Breed
trait Foox{
  def age: Int
  def addToAge(i: Int): Foox 
}
case class Dog(breed: Breed, age: Int) extends Foox
case class Person(name: String, age: Int) extends Foox
我希望addToAge它将返回与附加int相同的对象,当然我可以为每个类实现相同的,这与DRY规则相矛盾:
case class Dog(breed: Breed, age: Int) extends Foox{
  def addToAge(i: Int) = copy(age = age + i)
}
case class Person(name: String, age: Int) extends Foox{
  def addToAge(i:Int) = copy(age = age + i)
}
有没有更好的方法来避免这种情况?
是否有一个选项可以避免重新定义该年龄:在每个案例类中使用Int并保持其状态(年龄已经在特征中定义)?