2012-05-03 8 views
2

에 일치하는 case 문에지도 값을 사용하는 방법이 같은지도가스칼라

"omelet" match 
{ 
    case mealIdsMap("breakfast") => "Thank God" 
} 

이 오류가 발생합니다 :

error: value mealIdsMap is not a case class constructor, 
nor does it have an unapply/unapplySeq method 
       case mealIdsMap("breakfast") => "Thank God" 

누구나 일치/사례 명세서에서 이와 같은지도를 사용하는 방법을 알고 계십니까?

도움을 주셔서 감사합니다.

답변

7

튜토리얼에서 패턴 매칭의 목적이 무엇인지 읽어야합니다. this one (Google에서는 간단한 예입니다).

당신은 시험 반전 한

: 당신은 키가 있는지 확인하지 않으면 당신은 관용적 스칼라를 작성하려는 경우 (당신이 경우에도, 당신이 선호한다 그리고

mealIdsMap("breakfast") match { 
    case "omelet" => "Thank God" 
    case _ => "Don't forget a default" 
} 

을 :

get이 코드를 잡아 시도하거나 자동으로 깰 수 있도록 당신을 방지 옵션을 반환
mealIdsMap.get("breakfast") match { 
    case Some("omelet") => "Thank God" 
    case _ => "Don't forget a default" 
} 

.

+0

덕분에 많이 니콜라스 필요하지만 당신이 그것을 원하는 거의 같다. 도움이되었습니다. – ldavidson

2

비록 그 여전히 흥미로운 그런 행동을 달성하려고합니다. 이 예를 살펴 있습니다

case class InvMatcher (m:Map[String, String]){ 
def unapply(v:String):Option[String] = { 
    return m collectFirst {case (k, `v`) => k} 
} 

을}

이 클래스는지도를 역 일치하는 데 도움이됩니다. 사용 :

val ma = InvMatcher (Map (
    "breakfast"  -> "omelet", 
    "lunch"   -> "steak", 
    "dinner"  -> "salad" 
)); 

"steak" match { 
    case ma(s) => s match { 
    case "breakfast" => print("Thank God") 
    case "lunch" => print("whatever") 

    case _ => print("dont forget default") 
    } 
    case _ => print("dont forget default") 
} 

이것은 당신이 (여기에 기본 케이스를 필요 나던 ...) 두 번째 경기 문

+0

언 와인 팅 (covenantis)을위한 적용되지 않는 마법을 소개하기에는 조금 일찍 시작해야 겠지만 더 나은 구현을 수행 할 수 있을지 확신합니다. – Nicolas

+1

더 자세히 살펴 보았습니다 : 적용 할 수없는 코드를 다음과 같이 대체 할 수 있습니다 :'m collectFirst {case (k, \'v \') => k}' – Nicolas

+0

이 예제를 바꿨습니다. 'v'를 테스트하고 싶지 않지만 v 값은 – wrm