【问题标题】:Scala case match default valueScala大小写匹配默认值
【发布时间】:2013-12-07 13:14:03
【问题描述】:

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

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

【问题讨论】:

  • 不确定,你是说这可能吗? case _ => smth(something)
  • val config = 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 然后config match ....
  • 不,不是……我会试着从 Martin Odersky 那里得到他特别指出的演讲:“不要做一个班轮”:-)
  • @Caballero 不一定,可读性获胜,总是 =)
  • 我们开始了,youtube.com/watch?v=kkTFx3-duc8,从第 15 分钟开始“不要包装太多作为表达”。

标签: scala


【解决方案1】:
something match {
    case "val" => "default"
    case default => smth(default)
}

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

something match {
    case "val" => "default"
    case everythingElse => smth(everythingElse)
}

【讨论】:

  • 或者如果你不需要使用变量,它可以是匿名的:case _ => doSomething
  • @JeroenKransen 您的提议与 op 的起点完全一致
  • 我也不明白有效的问题。最近有一个类似的问题,How do I reference _ in an anon function。也许这就像那些视错觉谜题之一。
【解决方案2】:

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”。

说多了。我认为您对地图、平面地图中下划线的使用感到困惑。

val mylist = List(1, 2, 3)
mylist map { println(_) }

这里的下划线是指集合中的可迭代项。 当然,这个下划线甚至可以理解为:

mylist map { println } 

【讨论】:

  • 其实它不仅是 Scala 的东西——在 SML、Clojure 和其他一些语言中使用了 underscode-for-things-I-don't care。
【解决方案3】:

这是另一个选择:

something match {
    case "val" => "default"
    case default@_ => smth(default)
}

【讨论】:

  • 对于像我这样从未见过或忘记这一点的人:请参阅Scala @ operator
猜你喜欢
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2019-11-25
相关资源
最近更新 更多