Scala中的模式匹配和变量

时间:2017-03-20 15:39:38

标签: scala pattern-matching

我是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

我不太清楚在哪里使用@以及在哪里使用:。是否有一些严格定义的规则?

1 个答案:

答案 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和类型组成   模式Tx的类型是类型模式T,其中每种类型   变量和通配符由新的未知类型替换。这个   pattern匹配类型模式T匹配的任何值;它绑定了   变量名称为该值