2010-05-05 4 views
5

액터에서 패턴 일치에 사용하려는 열거 형을 사용하고 있습니다. 나는 내가 기대하는 것을 얻지 못하고 있으며, 지금 나는 단순한 무언가를 놓치고 있다고 의심하고 있습니다.스칼라 일치/비교 열거 형

내 열거, 그리고

object Ops extends Enumeration { 
    val Create = Value("create") 
    val Delete = Value("delete") 
} 

, 내가 문자열에서 비밀 작전을 만듭니다

case (Ops.Create, ...) 

그러나 Ops.Create 아무튼 내 경기를 내부

val op = Ops.valueOf("create") 

을, 내가 가진 ops.valueOf ("생성")와 같지 않음

(210)

전자는 원자 '생성'하고 나중에 일부 ...

바라 건데,이 사람이 내가 부족 무엇을 말해 줄 수있는 충분한 정보가 (생성)

감사하다

답변

7

그냥 Create의 사본을 얻으려고 노력하는 경우, 당신은 직접 코드에서 참조해야합니다 :

val op = Ops.Create 

을하지만 당신은 문자열에서 구문 분석하는 경우, 문자열이 쓰레기를 포함 할 수 있습니다, 그래서 valueOfOption는 반환

val op1 = Ops.valueOf("create") // Some(Ops.Create) 
val op2 = Ops.valueOf("delete") // Some(Ops.Delete) 
val op3 = Ops.valueOf("aljeaw") // None 

을 지금, 당신의 경기에서 방금 Option[Ops.Value] 함께 수행하고 찾아보실 수 있습니다 :

,
case(Some(Ops.Create),...) 

당신은 입력으로 정크에 대한 견고성을 내장하고 있습니다.

+0

어지간히 도움이되는 답변, 감사합니다 Rex! – Tim

+7

앞으로이 책을 읽는 사람은'Enumeration.valueOf'가 대신 사용됩니다 : 대신'withName'을 사용하십시오 –

1

Enumeration.valueOf은 존재하지 않는 값을 만들 것을 요청할 수 있으므로 None 또는 Some을 반환합니다. 예를 들어 적절한 열거 형 값이 없기 때문에 Ops.valueOf("blah")None을 반환합니다.

솔직히이 경우 또는 case objectEnumeration 대신 사용합니다 (더 나은 유형 안전성을 제공함).

-1

실제로 내가 원한 것을 얻기 위해 반환 된 일부의 'get'메소드를 사용해야하는 것처럼 보입니다. 예 :

ops.valueOf("create").get == Ops.Create 

직관적이거나 우호적이지는 않지만 작동합니다.

+0

'Enumeration.valueOf'는'option' 객체를 반환하기 때문에 값 값을 얻기 위해서는'get'을 사용해야합니다. – mipadi