Есть ли способ игнорировать несовпадающий регистр? - PullRequest
15 голосов
/ 26 марта 2011

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

Ответы [ 3 ]

28 голосов
/ 27 марта 2011

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

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

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

11 голосов
/ 27 марта 2011

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

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.

2 голосов
/ 27 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...