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(_)
}
Ответы
Ответ 1
something match {
case "val" => "default"
case default => smth(default)
}
Это не ключевое слово, просто псевдоним, поэтому это тоже будет работать:
something match {
case "val" => "default"
case everythingElse => smth(everythingElse)
}
Ответ 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 }
Ответ 3
здесь другой вариант:
something match {
case "val" => "default"
case [email protected]_ => smth(default)
}