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