Редактировать : части этого ответа неверны;см. ответ huynhjl .
Если вы опустите match
, вы сообщаете компилятору, что определяете частичную функцию .Частичная функция - это функция, которая не определена для каждого входного значения.Например, ваша функция фильтра определяется только для значений типа Some[A]
(для вашего пользовательского типа A
).
PartialFunction
s выдает MatchError
, когда вы пытаетесь применить их там, где они естьне определен.Поэтому, когда вы передаете PartialFunction
, где определен обычный Function
, вы должны убедиться, что ваша частичная функция никогда не будет вызываться с неопределяемым аргументом.Такой механизм очень полезен, например, для распаковки кортежей в коллекции: API
val tupleSeq: Seq[(Int, Int)] = // ...
val sums = tupleSeq.map { case (i1, i2) => i1 + i2 }
, которые запрашивают частичную функцию, такую как collect
фильтр-подобная операция над коллекциями, обычно вызывают isDefinedAt
перед применениемчастичная функция.Там безопасно (и часто требуется) иметь частичную функцию, которая не определена для каждого входного значения.
Итак, вы видите, что хотя синтаксис близок к синтаксису match
, он на самом делесовсем другая вещь, с которой мы имеем дело.