Есть ли способ игнорировать несоответствующий случай?

Если у меня есть выражение match, как я могу заставить его автоматически игнорировать несоответствие без, явно выполняющего case _ =>? Есть ли способ создать функцию, которая делает что-то вроде этого, может быть?

Ответы

Ответ 1

Вам нужен общий способ обработки "игнорирования". Варианты, среди других классов, обеспечивают это (помимо всего прочего). Таким образом, вы можете:

val i = 7
Some(i) collect {
  case 3 => "Yay!"
  case 5 => "Boo!"
}

чтобы получить None (набран как Option[String]). Поэтому в основном, если вы измените x match на Some(x) collect, вы получите нужную функциональность. Лучше сделать это, когда вам удобнее обрабатывать варианты.

Ответ 2

Напишите общий сокет:

object Match {
    def default: PartialFunction[Any, Unit] = { case _ => }
    def apply[T](x: T)(body: PartialFunction[T, Unit]) = (body orElse default)(x)
}

Пример:

scala> 1 to 5 foreach (Match(_) {
     |   case 2 => println("two")
     |   case 3 => println("three")
     | }
     | )
two
three

Вам может быть интересно также в методах компаньона PartialFunction cond и condOpt.

Ответ 3

Любой блок соответствия, который не может обрабатывать все возможные входные значения, образует Частичную функцию, которую можно определить и использовать в Scala.

PartialFunction является подклассом Function и добавляет метод isDefinedAt, который возвращает true, если он имеет определенное соответствие для поставленного значения. Частичные функции лучше всего использовать в тех местах, которые проверяют определение, например блоки catch или метод collect в API-интерфейсах 2.8. В противном случае вы получите исключение, если попытаетесь вызвать его со значением, которое не определено как вход.