Scala中的模式匹配和变量

St.*_*rio 3 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
Run Code Online (Sandbox Code Playgroud)

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

Yuv*_*kov 6

使用@时要绑定整个匹配类型的值,而且要绑定的类型中各个元素.这意味着:

case b @ Cls(i) =>
Run Code Online (Sandbox Code Playgroud)

将分配b给引用Cls,以便您可以i通过访问该值b.i.它还将绑定i到构造函数模式的第一个参数,它是类型的Int.当您需要评估类型的单个值但是还需要对类的完整引用时,这非常有用,即:

case b @ Cls(i) => if (i > 10) b else b.copy(i = 10)
Run Code Online (Sandbox Code Playgroud)

如果您只想将整个引用绑定Cls到一个新值,请使用:

case e: Cls =>
Run Code Online (Sandbox Code Playgroud)

这将引用绑定Cls到e.

如果我们想要更正式,case f @ Cls称为模式绑定器:

图案装订器x @ p由图案变量x和图案组成 p.变量x的类型T是模式 的静态类型p.这个形成图案的任何值匹配v由图案匹配p,提供的运行时类型v也是一个实例T,并将其绑定变量名到该值.

并case c: Cls称为类型模式:

类型化模式x:T由模式变量x和类型模式组成T.类型x是类型模式T,其中每个类型变量和通配符都由新的未知类型替换.此模式匹配类型模式匹配的任何值T; 它将变量名称绑定到该值