如何| (管)在模式匹配工作?

Knu*_*daa 33 scala pattern-matching

你可以写:

str match { case "foo" | "bar" => ... }
Run Code Online (Sandbox Code Playgroud)

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

str match { case |("foo", "bar") => ... }
Run Code Online (Sandbox Code Playgroud)

不起作用.(我无法看到无论如何都可以实现.)

那么它是一个神奇的内置运营商?

(我相信我之前已经在SO上看过这个问题了,但是找不到......)

Jea*_*let 39

|未在库中实现,它由Scala编译器解释.它构建了一个新模式,定义为两个不绑定任何变量的子模式之间的分离(尽管新形成的模式本身可以绑定;即,您可以编写类似的东西

try { /*...*/ }
catch {
  case e @ (_: IOException | _: IllegalArgumentException) => /*...*/
}
Run Code Online (Sandbox Code Playgroud)

e获得所列替代品中最具体的超类型的类型.


bma*_*eny 27

是的,pipe(|)是用于模式匹配的内置函数(请参阅scala语言参考).模式匹配部分(第8节)在8.1.11节中定义了什么称为模式替代.定义说:

模式替代p1 | ...... | pn由许多替代模式pi组成.使用预期的模式类型对所有替代模式进行类型检查.它们可能不会绑定除通配符之外的变量.如果至少一个替代模式匹配v,则替代模式匹配值v.

所以是的,管道是内置的,对模式匹配具有上下文敏感性.