Подтвердить что ты не робот

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

Ответ 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)
}