我是Scala的新手,对模式匹配的工作原理有点疑惑。想象一下,我有以下几点:
case class Cls(i: Int)
case b @ Cls(i) => //Ok
case e : Cls => //Ok
case f @ Cls => //Ok
case s: Cls(i) => //compile error
case str: String => //ok
我不太清楚在哪里使用@
以及在哪里使用:
。是否有一些严格定义的规则?
答案 0 :(得分:6)
如果要将整个匹配类型绑定到某个值,请使用@
,但也希望绑定该类型中的各个元素。这意味着:
case b @ Cls(i) =>
将b
分配给Cls
的引用,以便您可以通过i
访问b.i
值。它还会将i
绑定到构造函数模式的第一个参数,该参数的类型为Int
。当您需要评估该类型的各个值时,这也很有用,但也需要对该类的完整引用,即:
case b @ Cls(i) => if (i > 10) b else b.copy(i = 10)
如果您只想将Cls
的整个引用绑定到新值,请使用:
case e: Cls =>
这会将对Cls
的引用绑定到e
。
如果我们想要更加正式,case f @ Cls
被称为Pattern Binders:
模式绑定器
x @ p
由模式变量x
和模式组成p
。变量x
的类型是模式的静态类型T
p
。此模式匹配模式v
匹配的任何值p
, 如果v
的运行时类型也是T
的实例,那么它也是如此 将变量名称绑定到该值。
case c: Cls
被称为Typed Patterns:
类型化模式
x:T
由模式变量x
和类型组成 模式T
。x
的类型是类型模式T
,其中每种类型 变量和通配符由新的未知类型替换。这个 pattern匹配类型模式T
匹配的任何值;它绑定了 变量名称为该值