2

私はこのような地図を持っています:

val mealIdsMap: Map[String, String]    =
Map (
      "breakfast"     ->    "omelet",
      "lunch"         ->    "steak",
      "dinner"        ->    "salad"
)

次に、次のような match ステートメントで使用しようとします。

"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"

このようなマップを match/case ステートメントで使用する方法を知っている人はいますか?

助けてくれてどうもありがとう。

4

2 に答える 2

7

チュートリアルからパターン マッチングの目的を読む必要があります

テストを反転しました:

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

また、キーが存在するかどうかわからない場合 (存在する場合でも、慣用的な scala を書きたい場合は、次のようにすることをお勧めします。

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

wheregetはオプションを返し、コードをキャッチしようとしたり、黙って中断させたりすることを避けます。

于 2012-05-03T14:38:16.980 に答える
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")
}

2 番目の match-statement が必要ですが、これはほぼ希望どおりです (ここではデフォルトのケースは必要ありません...)。

于 2012-05-03T15:01:48.997 に答える