2013-09-03 13 views
7

マップキーとのパターンマッチングを有効にするScalaのトリックはありますか?言い換えれば、私は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

あなたの2番目の場合は、一致すると思われますか?一致した場合、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

PartialFunctionはandThenで連鎖され、.liftでオプション化されています。しかし、より簡潔な方法で行うことができるのであれば私は興味があります。 –

+1

私はそれが数学的に間違った仕事だと思います。一致を使用して順序付けされていないマップの要素を見つけると、予期しない結果が生じることがあります –

関連する問題