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

时间:2011-06-26 13:14:39

标签: scala pattern-matching

你可以写:

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

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

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

不起作用。 (我无法看到如何实现这一点。)

所以它是一个神奇的内置运营商?

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

2 个答案:

答案 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。

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