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

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

最佳答案

当您想将整个匹配类型绑定(bind)到一个值,但又想绑定(bind)类型内的单个元素时,请使用 @。这意味着:

case b @ Cls(i) =>

b 分配给 Cls 的引用,以便您可以通过 i 访问 b.i 值。它还将 i 绑定(bind)到构造函数模式的第一个参数,它的类型是 Int 。当您需要评估类型的单个值但还需要对类的整个引用时,这很有用,即:
case b @ Cls(i) => if (i > 10) b else b.copy(i = 10)

如果您只想将 Cls 的整个引用绑定(bind)到一个新值,请使用 :
case e: Cls =>

这将对 Cls 的引用绑定(bind)到 e

如果我们想要更正式一点, case f @ Cls 被称为 Pattern Binders :


case c: Cls 被称为 Typed Patterns :

关于scala - Scala 中的模式匹配和变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42907863/

10-12 17:31
查看更多