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

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

3 ответа

Решение

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

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

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

Напишите общее сопоставление:

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,

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

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

Другие вопросы по тегам