我有这样的地图:
val mealIdsMap: Map[String, String] =
Map (
"breakfast" -> "omelet",
"lunch" -> "steak",
"dinner" -> "salad"
)
然后我尝试在匹配语句中使用它:
"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"
任何人都知道如何在匹配/案例陈述中使用这样的地图吗?
非常感谢你的帮助。
答案 0 :(得分:7)
您应该从教程中了解模式匹配的目的,可能来自this one(谷歌的第一个非常重要的例子)。
你推翻了考试:
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"
}
get
返回一个选项,避免你尝试捕捉你的代码或让它静静地破解。
答案 1 :(得分: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")
}
这几乎是你想要的,虽然你需要第二个匹配语句(这里不需要默认情况......)