2012-11-11 14 views
2

我正在制作一个战略游戏,并尝试应用我学到的东西,尝试使用不可变数据。在我的游戏中我有单位,这些单位可以有不同的特殊功能。例如有些飞机可以隐藏自己。我搜索是一种方法,能够做到某种通过继承更新不可变的数据结构

abstract class Units { 
val life:Int 
} 

trait Hidable { self: Units => 
val hided:Boolean 
def hide:Units with Hidable= .... 
} 

,而不必复制粘贴:

def hide = copy(hided=true) 

上每一个案件类混入Hidable。

+0

所以让它变得可变,但只能在课堂上,所以你可以改变它。 –

+0

我真的需要返回一个新的Hidable实例。 – Atol

+1

只有使用宏或工具箱进行元编程才能为您提供帮助,因为每个case类的'copy'方法都是由编译器生成的。你可以在这里了解更多关于它:http://stackoverflow.com/questions/10373318/mixing-in-a-trait-dynamically –

回答

1

更新不可变数据结构的常用方法是使用lenses。 有一个compiler plugin为您的代码生成镜头,虽然它不是生产就绪。它也只适用于旧斯卡拉。

这是related question

+0

我使用最新的scalaz,如果它是手动添加一个字段的Lense,我更好的cp:复制:( – Atol

+0

)如果你要修改一个字段,你会得到一个'copy',如果你最终更新了一个深度嵌套的结构,镜头是一种可行的方法,您可以修改该编译器插件以某种方式生成镜头,scalaz-7指定。差异不大: 旧的方式:https://gist.github.com/1404336# file_lens.scala, 新的方式:https://github.com/folder/poi.scala/blob/master/src/main/scala/info/folone/scala/poi/package.scala#L49。 或创建一个你自己的插件,使用宏。 – folone