关于scala:如何|

How does | (pipe) in pattern matching work?

你可以写:

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

乍一看,|可能是一个提取器对象,但是:

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

不起作用。(我也不知道这是怎么实现的。)

所以它是一个神奇的内置操作器?

(我相信我以前见过这个问题,但不可能找到…)


|没有在库中实现,它由scala编译器解释。它构建了一个新的模式,定义为两个子模式之间的分离,这些子模式不绑定任何变量(尽管新形成的模式本身可以绑定;也就是说,您可以编写如下内容

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

e得到的类型是所列备选方案中最具体的超类型)。


是的,管道(|是用于模式匹配的内置组件(参见scala语言参考)。模式匹配部分(第8节)在第8.1.11节中定义了所谓的模式备选方案。定义是:

A pattern alternative p1 | ... | pn
consists of a number of alternative
patterns pi . All alternative patterns
are type checked with the expected
type of the pattern. They may no bind
variables other than wildcards. The
alternative pattern matches a value v
if at least one its alternatives
matches v.

所以是的,管道是一个内置的,对模式匹配上下文敏感。