Scala案例匹配默认值

时间:2013-11-22 15:31:11

标签: scala

如何在匹配情况下获取默认值?

//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(_)
            }

3 个答案:

答案 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)
}