Scala |(pipe)在模式匹配中是如何工作的?
你可以写:Scala |(pipe)在模式匹配中是如何工作的?,scala,pattern-matching,Scala,Pattern Matching,你可以写: str match { case "foo" | "bar" => ... } 乍一看,它可能是一个提取器对象,但是: str match { case |("foo", "bar") => ... } 不起作用。(我看不出这是如何实现的。) 所以它是一个神奇的内置操作符 (我相信我以前见过这个问题,但不可能搜索…)|不是在库中实现的,而是由Scala编译器解释的。它构建了一个新模式,该模式定义为两个子模式之间的分离,这两个子模式不绑定任何变量(尽管新形成的模式本身可
str match { case "foo" | "bar" => ... }
乍一看,它可能是一个提取器对象,但是:
str match { case |("foo", "bar") => ... }
不起作用。(我看不出这是如何实现的。)
所以它是一个神奇的内置操作符
(我相信我以前见过这个问题,但不可能搜索…)
|
不是在库中实现的,而是由Scala编译器解释的。它构建了一个新模式,该模式定义为两个子模式之间的分离,这两个子模式不绑定任何变量(尽管新形成的模式本身可以绑定;也就是说,您可以编写类似
try { /*...*/ }
catch {
case e @ (_: IOException | _: IllegalArgumentException) => /*...*/
}
和e
获取所列备选方案中最具体的超类型作为类型)。是的,管道(|
)是一个内置的模式匹配(请参阅)。模式匹配部分(第8节)在第8.1.11节中定义了所谓的模式备选方案。定义是:
模式选择p1 |…|pn
由若干备选方案组成
模式pi。所有替代模式
是否使用预期的
图案的类型。他们可能没有约束力
通配符以外的变量。这个
替代模式与值v匹配
如果至少有一个选择,它的替代方案
匹配
是的,管道是一个内置的,对模式匹配是上下文敏感的。下面是一个例子。