2013-09-03 6 views
7

지도 키에 패턴 일치를 사용하도록 설정하는 스칼라 트릭이 있습니까? 다른 말로하면 Map 인스턴스 옆에있는 추출기를 사용하여 키 값을 받아 들여서 일치 가능한 값이 Map의 인스턴스이고 주어진 키가있는 항목이있는 경우에만이 패턴을 일치 시키려고한다는 뜻입니다. 이 항목의 값은 재귀 패턴 매칭의 대상이됩니다. 이 같은스칼라지도 항목과 일치하는 패턴

뭔가 :

myMap match { 
    case MyMap("a")(a) => // do smth with value a 
    case MyMap("b")(MyMap("c")(c)) => // do smth with value c 
} 

업데이트 :

내가 목표에 더 가까이 접근 할 수있는 방법을 찾았지만 합성 키 - 값의 정의를 의미하기 때문에 아직 완벽 하진 -holders :

case class MapKey[K](key: K) { 
    def unapply(o: Any) = o match { 
    case m: Map[K, _] ⇒ m.get(key) 
    case _ ⇒ None 
    } 
} 

val m1 = Map("a" → "aa", "b" → Map("c" → "cc")) 
val m2 = Map("a" → "aa", "d" → "dd") 

val b = MapKey("b") 
val c = MapKey("c") 
val d = MapKey("d") 

for (m ← List(m1, m2)) m match { 
    case b(c(x)) ⇒ println(s"b > c: $x") 
    case d(x) ⇒ println(s"d: $x") 
} 

비슷한 질문 : Can extractors be customized with parameters in the body of a case statement (or anywhere else that an extractor would be used)?

기능 요청 : SI-5435

+1

당신은 당신이 또한 myMap'는'여부를 일치시킬 위치 : 당신은 키 - 값 쌍을 일치시킬 경우 PF를 사용할 수 있습니다 지도? 그 밖의 무엇이있을 수 있 었는가? – ziggystar

+0

두 번째로 일치 할 것으로 예상되는 사례는 무엇입니까? 일치하는 경우 myMap은 어떤 모습입니까? – Shadowlands

+0

이것은 단순화 된 예입니다. 실제로 NSObject에서 파생 된 Apple Cocoa 유형에 대한 작업을위한 Scala 라이브러리를 개발 중입니다. 특히, 작업은 동일한 것을 설명하는 여러 대체 방법으로 매우 정교한 iOS Plist 파일을 구문 분석하는 것입니다. –

답변

1

어쩌면 당신은 정말로 필요하지 않은 해결책을 찾고 있습니까? 여기서 추출기를 상상할 수 없습니다. 우리가 사용하기 때문에

val map = Map[String, String]("a" -> "b") 

def matchTuple[A,B,C](map: Map[A,B])(pf: PartialFunction[(A,B), C]) = 
    map.collectFirst(pf) 

matchTuple(map) { 
    case ("a", b) => println("value for a is " + b) 
} 

반환 유형이 collectFirst 옵션 [단위]과에 println

+0

andThen으로 연결되고 .lift를 통해 옵션 화 된 PartialFunction은 지금까지이 알고리즘을 구현 한 방법입니다. 그러나보다 간결한 방법으로 할 수 있다면 궁금합니다. –

+1

나는 그것이 수학적으로 잘못된 작업이라고 생각한다. 일치를 사용하여 정렬되지 않은지도의 요소를 찾으면 예기치 않은 결과가 발생할 수 있습니다. –