2012-11-11 41 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