Есть ли способ игнорировать несовпадающий регистр?
Если у меня есть 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. В противном случае вы получите исключение, если попытаетесь вызвать его со значением, которое не определено как вход.