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)
我不太明白在哪里使用@以及在哪里使用:.是否有一些严格定义的规则?
使用@时要绑定整个匹配类型的值,而且要绑定的类型中各个元素.这意味着:
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; 它将变量名称绑定到该值
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |