2011-04-05 4 views
0

해당 인스턴스 외부의 정보에 따라 개체 인스턴스의 복사본을 조건부로 만들고 싶습니다. 사본에있는 대부분의 정보는 원본과 동일하지만 일부 정보는 변경해야합니다. 이 정보는 액터들 사이를 지나가고 있기 때문에 이상한 동시성 관련 동작을 피하기 위해 객체를 불변으로 유지해야합니다. 다음 장난감 코드는 내가 도움이 될만한 간단한 예제입니다.변경 불가능한 인스턴스 만들기 및 관용적 인 방법으로 복사본 수정

나는 다음과 같은 코드가있는 경우 :

case class Container(condition:String,amount:Int,ID:Long) 

내가 할 수 다음

val a = new Container("Hello",10,1234567890) 
    println("a = " + a) 
    val b = a.copy(amount = -5) 
    println("b = " + b) 
    println("amount in b is " + b.amount) 

를 출력 내가 또한 조건의 복사본을 만들 수 있습니다

a = Container(Hello,10,1234567890) 
b = Container(Hello,-5,1234567890) 
amount in b is -5 

입니다 다음을 수행하는 객체 :

I -5에 B 객체의 크기를 설정하면 691,363,210
import scala.Math._ 
val max = 3  
val c = if(abs(b.amount) >= max) b.copy(amount = max,condition="Goodbye") else if(abs(b.amount) < max) b.copy(amount = abs(b.amount)) 
println("c = " + c) 

후 출력

c = Container(Goodbye,3,1234567890) 

이고 I는 -2로 B 오브젝트의 양을 설정하면, 출력은

c = Container(Hello,2,1234567890) 
내가 c.amount을 인쇄 할 때 그러나, 다음과 같은 메시지가 컴파일러에 의해 신고되어

println("amount in c is " + c.amount) 
01 I는 I 컴파일러 에러를

타입 불일치를 얻을

val c:Container = if(abs(b.amount) >= max) b.copy(amount = max,condition="Goodbye") else if(abs(b.amount) < max) b.copy(amount = abs(b.amount)) 

로 C 오브젝트 작성 라인을 변경하면 23,516,

값 량 상관

의 구성원이고; 발견 단위가 필요합니다 : 컨테이너

기존 인스턴스를 복사하고 값 또는 두 가지를 수정하여 경우 클래스의 불변의 인스턴스를 생성 조건의 가장 좋은, 관용적 인 방법은 무엇입니까

를?

감사합니다, 브루스 당신은 최종 else 절을 포함하지 않는

답변

12

. 따라서 c의 유형은 Any입니다 - Unit가 포괄 else 절을 포함하지 않는 결과 ContainerUnit의 슈퍼 타입 모두 유일한 유형. 결과 유형을 Container으로 지정하려고 시도 할 경우 c: Container =을 작성하면 컴파일러에서 else 절을 알려줌으로써 UnitContainer에 할당되지 않습니다.

따라서

val c = if (abs(b.amount) >= max) { 
    b.copy(amount = max, condition = "Goodbye") 
} else if (abs(b.amount) < max) { 
    b.copy(amount = abs(b.amount)) 
} else b // leave untouched ! 

작품. 컴파일러는 마지막으로 else 절이 논리적으로 도달 할 수 없다는 것을 알기에 충분히 똑똑하지 않습니다. (그들은 abs>=<의 의미는 상호 배타적이며 포괄적이며 abs은 그대로 작동한다는 것을 알아야합니다. b.amount). 당신은이 개 조항이 상호 배타적하고 완전한 것을 알고이후 즉

, 당신은, 그 작동

val c = if (abs(b.amount) >= max) { 
    b.copy(amount = max, condition = "Goodbye") 
} else { // i.e. abs(b.amount) < max 
    b.copy(amount = abs(b.amount)) 
} 
+0

감사를 단순화 할 수 있습니다 –