2012-11-11 5 views
2

을 통해 나는 전략적 게임을 만들고있어 내가, 내가 배운 것을 적용 불변의 데이터를 사용하려고 시도합니다. 내 게임에는 유닛이 있고,이 유닛은 다른 특수 기능을 가질 수 있습니다. 예를 들어 일부 비행기는 자신을 숨길 수 있습니다. 내가 검색하여 붙여 넣기를 복사 할 필요없이업데이트 불변의 데이터 구조는 상속

abstract class Units { 
val life:Int 
} 

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

의 일종을 수행 할 수있는 방법입니다 : 믹스 인 Hidable 모든 경우 클래스에

def hide = copy(hided=true) 

.

+0

그래서 클래스 내에서만 변경할 수 있도록 변경하면됩니다. –

+0

정말 Hidable의 새로운 인스턴스를 반환해야합니다. – Atol

+1

매크로 나 툴박스로 메타 프로그래밍 만하면 도움이 될 수 있습니다. 각 사례 클래스의'copy' 메소드는 컴파일러에 의해 생성되므로 유용합니다. 당신은 여기에 대해 자세히 알아볼 수 있습니다 : http://stackoverflow.com/questions/10373318/mixing-in-a-trait-dynamically –

답변

1

불변의 데이터 구조를 업데이트하는 일반적인 방법은 - lenses를 사용한다. 매우 생산 준비가되지 않았지만 코드 용 렌즈를 생성하는 데는 compiler plugin이 있습니다. 오래된 스 카즈에만 사용할 수 있습니다.

는 여기 related question입니다.

+0

내가 최신 scalaz을 사용하고가 있다면 단일 필드에 Lense를 수동으로 추가하면 cp : copy :( – Atol

+0

단일 필드를 수정하는 경우'copy'를 사용하게됩니다. 어떤 시점에서 깊이 중첩 된 구조를 끝내면, .. 렌즈가 갈 수있는 방법 당신은 방법으로 렌즈를 생성하는 컴파일러 플러그인을 수정할 수 scalaz 명의 지정의 차이는 큰 것보다되지 않습니다 : 옛날 방식 : https://gist.github.com/1404336# file_lens.scala, 새로운 방법 :. https://github.com/folone/poi.scala/blob/master/src/main/scala/info/folone/scala/poi/package.scala#L49 또는 생성 매크로를 사용하여 자신의 플러그인. – folone