如何在匹配情况下获取默认值?
//Just an example, this value is usually not known
val something: String = "value"
something match {
case "val" => "default"
case _ => smth(_) //need to reference the value here - doesn't work
}
更新:我发现我的问题并没有真正理解,这就是为什么我会展示一个更接近我正在处理的真实事物的例子:
val db = current.configuration.getList("instance").get.unwrapped()
.map(f => f.asInstanceOf[java.util.HashMap[String, String]].toMap)
.find(el => el("url").contains(referer))
.getOrElse(Map("config" -> ""))
.get("config").get match {
case "" => current.configuration.getString("database").getOrElse("defaultDatabase")
case _ => doSomethingWithDefault(_)
}
答案 0 :(得分:47)
something match {
case "val" => "default"
case default => smth(default)
}
它不是关键字,只是别名,所以这也可以使用:
something match {
case "val" => "default"
case everythingElse => smth(everythingElse)
}
答案 1 :(得分:14)
Scala中的“_”是一种爱恨交织的语法,它可能非常有用且令人困惑。
在你的例子中:
something match {
case "val" => "default"
case _ => smth(_) //need to reference the value here - doesn't work
}
_表示,我不关心值和类型,这意味着你不能再引用标识符了。 因此,smth(_)没有适当的参考 解决方案是您可以为标识符指定名称,如:
something match {
case "val" => "default"
case x => smth(x)
}
我相信这是一个有效的语法,x将匹配任何值,但不匹配“val”。
更多说法。我认为你对map,flatmap中下划线的使用感到困惑。
val mylist = List(1, 2, 3)
mylist map { println(_) }
此处下划线引用集合中的可迭代项。 当然,这个下划线甚至可以被视为:
mylist map { println }
答案 2 :(得分:2)
这是另一种选择:
something match {
case "val" => "default"
case default@_ => smth(default)
}