Scala案例匹配默认值

Cab*_*ero 35 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
}
Run Code Online (Sandbox Code Playgroud)

更新:我看到我的问题并没有被真正理解,这就是为什么我展示了一个更接近我正在研究的真实事物的例子:

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(_)
            }
Run Code Online (Sandbox Code Playgroud)

om-*_*nom 50

something match {
    case "val" => "default"
    case default => smth(default)
}
Run Code Online (Sandbox Code Playgroud)

它不是关键字,只是别名,所以这也可以:

something match {
    case "val" => "default"
    case everythingElse => smth(everythingElse)
}
Run Code Online (Sandbox Code Playgroud)

  • @JeroenKransen你的命题完全等于op的起源 (3认同)

Joy*_*age 15

Scala中的"_"是一种爱恨交织的语法,它可能非常有用且令人困惑.

在你的例子中:

something match {
    case "val" => "default"
    case _ => smth(_) //need to reference the value here - doesn't work
}
Run Code Online (Sandbox Code Playgroud)

_表示,我不关心值,以及类型,这意味着你不能再引用标识符了.因此,smth(_)没有适当的参考.
解决方案是您可以为标识符指定名称,如:

something match {
    case "val" => "default"
    case x => smth(x)
}
Run Code Online (Sandbox Code Playgroud)

我相信这是一个有效的语法,x将匹配任何值,但不匹配"val".

更多说.我认为你对map,flatmap中下划线的使用感到困惑.

val mylist = List(1, 2, 3)
mylist map { println(_) }
Run Code Online (Sandbox Code Playgroud)

这里的下划线引用了集合中的可迭代项.当然,这个下划线甚至可以被视为:

mylist map { println } 
Run Code Online (Sandbox Code Playgroud)