Scala 学习 -- 样例类和模式匹配

Scala 学习 -- 样例类和模式匹配

1.样例类

样例类是Scala用来对对象进行模式匹配而并不用大量样板代码的方式。

样例类使用case作为修饰符,其特点如下:

1.添加一个跟类同名的工厂方法,用于对象构造

scala> val v = Var("x")
v:Var = Var(x)

2.参数列表中参数隐式获得一个val前缀

scala> v.name
res0: String = x

3.编译器会添加一个copy方法用于制作修改过的拷贝

scala> op.copy(operator = "-")
res4: BinOp = BinOp(-, Number(1.0), Var(x))

2.模式匹配

选择器 match {可选择分支}
模式匹配包含一系列以case关键字打头的可选分支,每个可选分支都包括一个模式以及一个或多个表达式。箭头符=>用于将模式和表达式分开。一个match表达式的求值过程是按照模式给出的顺序逐一尝试。
模式匹配包括三种形式: 常量模式,变量模式和通配模式

match与switch对比:
1.match是一个表达式
2.scala的可选分支不会贯穿到下一个case
3.若没有一个模式匹配上,会抛出名为MatchError的异常。=> 所有的case被覆盖到

三种匹配模式:
1.通配模式
通配模式(-)会匹配任何对象
expr match{
    case BinOp(op, left, right) =>
    	println(expr + "is a binary operation")
    case _ => //处理默认case
}
2.常量模式
常量模式仅匹配自己,任何字面量都可以作为常量(模式)使用。任何val或单例对象也可以被视作常量模式使用。
def describe(x:Any) = x match {
    case 5 => "five"
    case true => "truth"
    case "hello" => "hi!"
    case Nil => "the empty list"
    case _ => "something else"
}
3.变量模式
变量模式匹配任何对象。scala将对应变量绑定到匹配上的对象。
---------------------------------------------------------
===>
scala 模式匹配区分常量变量方法:
一个以小写字母打头的简单名称会被当做模式变量处理;所有其他引用都是常量。
使用小写名称作为模式常量相关技巧:
1.如果常量是某个对象的字段,可以在字段名前面加上限定词。如this.pi
2.用反引号将这个名称包起来,如case `pi`

3.深度匹配:首先检查被匹配的对象是否是以这个名称命名的样例类实例,然后再检查这个对象的构造方法参数是否匹配这些额外给出的模式。

4.序列模式: _* 作为模式的最后一个元素

5.元组模式

6.带类型的模式
模式转换: isInstanceOf[Type]  与   asInstanceOf[Type]

7.类型擦除
scala使用了擦除式泛型,这意味着在运行时并不会保留类型参数信息。对于擦除规则唯一例外的是数组,Java和Scala作为特殊处理。

8.变量绑定
变量名、 一个@符、 模式本身 => 变量绑定模式
expr match {
    case UnOp("abs", e @ UnOp("abs", _)) => e
    case _ =>
}

3.模式守卫

Scala中要求模式都是线性的,同一个模式变量只能在模式中出现一次。
使用模式守卫解决多次使用模式变量的方法,如下:
def simplifyAdd(e:Expr) = e match {
    case BinOp("+", x, y) if x == y => BinOp("*", x, Number(2))
    case _ => e
}
注:模式守卫出现在模式之后,并以if打头

4.模式重叠

捕获所有case出现在更具体的简化规则之后

5.密封类

通过将样例类的超类标记为密封(sealed),确保覆盖了所有case.
密封类除了在同一个文件中定义的子类之外,不能添加新的子类。
如果对继承自密封类的样例类做匹配,编译器会用警告消息标识出缺失的模式组合。
pl:
sealed abstract class Expr
case class Var(name:String) extends Expr

通过MatchError异常指明某些可能出现的模式并没有处理。

可以通过添加“@unchecked”注解,压制编译器对后续模式分支的覆盖完整性检查
pl:
def describe(e:Expr):String = (e:@uncheck) match{
    case Number(_) => "a number"
    case Var(_) => "a variable"
}

6.Option类型

scala使用一个名为Option的标准类型来表示可选值,Some(x) 其中x为那个实际的值, None对象,代表没有值。

7.偏函数

偏函数是指具有类型PartialFunction[-T, +V]的一种函数,T为接受的类型,V是返回的类型。
偏函数的最大特点,它只接受和处理其参数定义域的一个子集,而对自己外的参数抛出异常。
原文地址:https://www.cnblogs.com/ganshuoos/p/12953571.html