2012-12-03 1 views
1

이 질문은 첫 번째와 관련이 : Iteration over a sealed trait in Scala?열거 형 -> "값"이있는 봉인 된 특성?

나는이 지금은 잘 작동 다음 밀봉 특성

/** 
* @author Sebastien Lorber (<i>[email protected]</i>) 
* Date: 02/12/12 - Time: 17:49 
*/ 
sealed trait ResizedImageKey { 

    /** 
    * Get the dimensions to use on the resized image associated with this key 
    */ 
    def getDimension(originalDimension: Dimension): Dimension 

} 

object ResizedImageKey { 
    val ALL_KEYS: List[ResizedImageKey] = List(Large,Medium,Small,X2) 
} 

case class Dimension(width: Int, height: Int) 

case object Large extends ResizedImageKey { 
    def getDimension(originalDimension: Dimension) = Dimension(1000,1000) 
} 

case object Medium extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(500,500) 
} 

case object Small extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(100,100) 
} 

case object X2 extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(
    width = originalDimension.width * 2, 
    height = originalDimension.height * 2 
) 
} 

에게 있습니다. 문제는 ResizeImageKey를 Salat과 함께 MongoDB에 저장 될지도의 키로 사용할 수 있어야한다는 것입니다.

저는 Salat이 "sealed trait conversionion"을 지원하지 않는다고 생각합니까? Enumeration으로 이동해야합니까? 그러면 치수 계산을 위해 일치/대/소문자를 구분해야합니까? 아니면이 문제에 대한 알려진 해결책이 있습니까? Enumeration 등을 확장하지 않고 열거 형 Value 객체를 만들 수 있습니까?

감사합니다.

+0

형질이 봉인 되었기 때문에 "match is not exhaustive ..."라는 경고가 나타납니다. – yakshaver

답변

2

여기에 Salat 개발자.

Salat는 @Salat 주석을 사용하여 케이스 객체 계층 구조를 지원합니다. (I 스칼라에서 열거 형을 사용하는 것이 좋습니다 결코- 그들은 무서운입니다.)

을 ... 지금지도의 키가 실제로 지원을 몽고 것이 아닙니다 같은 경우 객체를 사용. 몽고의 모든지도 키는 문자열이어야합니다.

그렇다면이지도를 어떻게 보입니까?

+0

감사합니다. 그것은 [ImageResizeKey, FileDescriptor]처럼 보이고 가능한 한 [String, FileDescriptor]를하는 것보다 선호합니다. –

+0

불행히도, MongoDB는 객체를 맵의 키로 사용하는 것을 지원하지 않기 때문에, 당신이 할 수있는 것은 케이스 클래스의리스트를 유지하고 그것을 케이스 클래스 내에서 게으른 val로 맵으로 변환하는 것입니다. MongoDB는 키가 문자열로 매핑되도록 명시 적으로 제한합니다. – prasinous