Scala 学习 -- 样例类和模式匹配
Posted ganshuoos
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是返回的类型。
偏函数的最大特点,它只接受和处理其参数定义域的一个子集,而对自己外的参数抛出异常。
以上是关于Scala 学习 -- 样例类和模式匹配的主要内容,如果未能解决你的问题,请参考以下文章