Как работает | (труба) в работе сопоставления с образцом? - PullRequest
33 голосов
/ 26 июня 2011

Вы можете написать:

str match { case "foo" | "bar" => ... }

На первый взгляд кажется, что | может быть объектом-экстрактором, однако:

str match { case |("foo", "bar") => ... }

не работает.(И я не могу понять, как это можно реализовать в любом случае.)

Так что это волшебный встроенный оператор?

(я думаю, что я видел этот вопрос на SO раньше, ноневозможно искать ...)

Ответы [ 2 ]

39 голосов
/ 26 июня 2011

| не реализован в библиотеке, он интерпретируется компилятором Scala. Он создает новый шаблон, который определяется как дизъюнкция между двумя подшаблонами, которые не связывают ни одну переменную (хотя вновь сформированный шаблон может сам быть связан; то есть вы можете написать что-то вроде

try { /*...*/ }
catch {
  case e @ (_: IOException | _: IllegalArgumentException) => /*...*/
}

и e получают как тип самый специфический супертип из перечисленных альтернатив).

27 голосов
/ 26 июня 2011

Да, канал (|) является встроенным для сопоставления с образцом (см. справочник по языку scala ).Раздел соответствия шаблонов (раздел 8) определяет в разделе 8.1.11 то, что называется Альтернативы шаблонов .Определение гласит:

Альтернативная модель p1 |... |pn состоит из ряда альтернативных шаблонов pi.Все альтернативные шаблоны проверяются на тип с ожидаемым типом шаблона.Они могут не связывать переменные, кроме подстановочных знаков.Альтернативный шаблон соответствует значению v, если хотя бы один из его альтернатив соответствует v.

Так что да, канал является встроенным, который чувствителен к контексту для сопоставления с шаблоном.

...