你可以写:
str match { case "foo" | "bar" => ... }
乍一看,看起来|
可能是一个提取器对象,但是:
str match { case |("foo", "bar") => ... }
不起作用。 (我无法看到如何实现这一点。)
所以它是一个神奇的内置运营商?
(我相信我之前已经在SO上看过这个问题了,但是找不到......)
答案 0 :(得分:39)
|
未在库中实现,它由Scala编译器解释。它构建了一个新模式,定义为两个不绑定任何变量的子模式之间的分离(虽然新形成的模式本身可以绑定;即,你可以编写像
try { /*...*/ }
catch {
case e @ (_: IOException | _: IllegalArgumentException) => /*...*/
}
和e
获得列出的备选方案中最具体的超类型。
答案 1 :(得分:27)
是管道(|
)是内置的模式匹配(参见the scala language reference)。模式匹配部分(第8节)在8.1.11节中定义了所谓的模式替代。定义说:
模式替代p1 | ...... | PN 由许多替代品组成 模式pi。所有替代模式 是预期的类型检查 模式的类型。他们可能没有约束力 除通配符之外的变量。该 替代模式匹配值v 如果至少有一个替代品 匹配v。
所以,是的,管道是内置的,对模式匹配具有上下文敏感性。