Scala 通过继承更新不可变的数据结构

Scala 通过继承更新不可变的数据结构,scala,immutability,scalaz,subtyping,lenses,Scala,Immutability,Scalaz,Subtyping,Lenses,我正在做一个战略游戏,我试图运用我学到的知识,尝试使用不变的数据。在我的游戏中我有单位,这些单位可以有不同的特殊功能。举例来说,有些飞机可以隐藏自己。我所寻找的是一种能够做某种事情的方法 abstract class Units { val life:Int } trait Hidable { self: Units => val hided:Boolean def hide:Units with Hidable= .... } 无需复制粘贴: def hide = copy(hid

我正在做一个战略游戏,我试图运用我学到的知识,尝试使用不变的数据。在我的游戏中我有单位,这些单位可以有不同的特殊功能。举例来说,有些飞机可以隐藏自己。我所寻找的是一种能够做某种事情的方法

abstract class Units {
val life:Int
}

trait Hidable { self: Units => 
val hided:Boolean
def hide:Units with Hidable= ....
}
无需复制粘贴:

def hide = copy(hided=true)

在每个混合了Hidable的case类上

更新不可变数据结构的常用方法是使用。 有一种方法可以为您的代码生成镜头,尽管它还不是很适合生产。它也仅适用于旧scalaz


这里有一个.

让它可变,但只在类内,这样你就可以更改它。我真的需要返回一个Hidable的新实例。只有使用宏或工具箱的元编程可以帮助你,因为每个case类的
copy
方法都是由编译器生成的。您可以在此处了解更多信息:更好的复制粘贴我的函数无处不在,然后:我使用最新的scalaz,如果要为单个字段手动添加透镜,我最好cp:copy:(如果你要修改一个字段,你只需要拷贝一个
。如果在某个时候你最终更新了一个深度嵌套的结构,那么镜头是一个不错的选择。你可以修改编译器插件,以scalaz seven指定的方式生成镜头。区别并不大:旧的方式:,新的方式:。或者创建一个你自己的插件,u唱宏。