• 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是返回的类型。
    偏函数的最大特点,它只接受和处理其参数定义域的一个子集,而对自己外的参数抛出异常。
    
  • 相关阅读:
    Qt操作xml文件(增删改功能)
    Qt解析xml
    Qt中使用DOM解析XML文件或者字符串二(实例)
    Qt中使用DOM解析XML文件或者字符串(实例)
    QThread 实用技巧、误区----但文档中没有提到
    事件循环与线程 二
    事件循环与线程 一
    第一讲 递归
    Ubuntu 建立桌面快捷方式
    Codeforces554B:Ohana Cleans Up
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/12953571.html
Copyright © 2020-2023  润新知