Scala学习文档-样本类与模式匹配

样本类:添加了case的类便是样本类。这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定。

//样本类case class
//层级包括一个抽象基类Expr和四个子类,每个代表一种表达式
//样本类自动添加与类名一致的工厂方法
abstract class Expr
case class Var(name:String) extends Expr//括号内参数不用加val,默认为加val的字段
case class Number(num:Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left:Expr,right:Expr)extends Expr
  def main(args:Array[String]):Unit = {
    //1、样本类自动添加与类名一致的工厂方法,所以可以不用new
    val v = Var("x");
    val op = BinOp("+",Number(1.0),v);
    //2、样本类参数列表中的所有参数隐式获得了val前缀,所以为字段
    var s1:String = v.name //============================================================//  
    //match对应于Java里的Switch
    //选择器 match{备选项}  取代了 switch{选择器}{备选项}
    //一个备选项包含了一个模式以及多个表达式,箭头符号=>隔开了模式与表达式

    //本函数不对表达式进行任何的改变,只用来返回用来做匹配的表达式expr
    def simplifyTop(expr:Expr):Expr = expr match{
      case UnOp("-",UnOp("-",e)) =>e
      case BinOp("+",e,Number(0))=>e
      case BinOp("*",e,Number(1))=>e    case _ => expr //如果没有通配, 在匹配不到的时候抛出异常    
    }
    println(simplifyTop(BinOp("+",v,Number(0))))
    println(simplifyTop(BinOp("*",op,Number(1))))
  }

模式匹配

match与switch的比较:匹配表达式可以被看作Java风格Switch的泛化。但有三点不同:

  1. match是Scala的表达式,始终以值作为结果;
  2. Scala的备选项表达式永远不会“掉到”下一个case;
  3. 如果没有模式匹配,MatchError异常会被抛出。这意味着必须始终确信所有的情况都考虑到了,或者至少添加一个默认情况什么都不做。如 case _ =>
时间: 2024-10-12 02:17:18

Scala学习文档-样本类与模式匹配的相关文章

Scala学习文档-各种使用模式的情况

模式在变量定义中 在定义val或者var的时候,可以使用模式替代简单的标识符,如可以使用模式拆分元组,并把每个值分配给变量 val myTuple = (123,"abc") var (num,str) = myTuple 如此,num=123,str="abc" 如果知道正在使用的样本类的精确结构,可以使用模式结构它 val op = BinOp("+",Number(1.0),Var(x)); val BinOp(ele1,ele2,ele3

Scala学习文档-访问修饰符

在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FClass{ protected def fun(){ println("myfunction") } } class SClass extends FClass{ fun()//允许访问 } class OtherC{ fun()//错误 不允许访问 } } 保护的作用域 Scala里的访问修

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

Spark样本类与模式匹配

一.前言 样本类(case class)与模式匹配(pattern matching)是Scala中一个比较复杂的概念,往往让人感觉深陷泥沼.我在这里对Scala中的样本类与模式匹配进行了一些整理,希望让大家有些收获. 要学习样本类与模式匹配,先要理解这两个基本概念 .样本类是Scala提出的新概念,简单可以理解成希望用来做模式匹配的类加上case关键词就是样本类.模式匹配可以拆开来理解.这里模式不同于设计模式的模式,而是数据结构上的模式.这里的模式(pattern)是一个只包含变量. 有点类似

2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play FrameWork开发入门 5 1.准备工作 5 2.新建项目 5 3.环境变量配置 7 4.MVC模型 8 app/controllers 9 app/models 9 app/views 9 5.应用程序布局 9 app目录 9 .class文件在哪儿? 9 public目录 10 conf目录 10 l

Windows Workflow学习文档

Windows Workflow学习文档   1     概念 2     Windows Workflow 2.1      .Net Framework 3.0 简介 2.2      Windows Workflow Foundation简介 3     开发环境搭建 4     Workflow模型 4.1      WF中流程模型 4.2      关键概念 5     Activity 5.1      什么是Activity 5.2      Activity的其他概念 5.3  

样本类和模式匹配

一:样本类就是使用case关键字声明的类,和普通类的用法都一致. package 样本类和模式匹配 /** * @Author:Alex_lei * @Description: */ object Case_class { /** * people就是样本类 * @param name 名字属性 * @param age 年龄属性 */ case class people(name:String,age:Int) def main(args: Array[String]): Unit = { v

Mybatis学习文档

Mybatis学习文档 Mybatis是持久层框架类似于Hibernate的orm持久层框架 1.JDBC访问数据库存在的问题 频繁创建和打开.关闭数据链接,太消耗资源 Sql语句存在硬编码,不利于维护 Sql参数设置硬编码,不利于维护 结果集获取与遍历复杂,存在硬编码,不利于维护,期望查询后返回一个java对象 2.Mybatis介绍 前身是apache下的开源项目,2010有aspache software foundation 迁移到了google code ,并且改名为Mybatis,2

NodeJS-001-Nodejs学习文档整理(转-出自http://www.cnblogs.com/xucheng)

Nodejs学习文档整理 http://www.cnblogs.com/xucheng/p/3988835.html 1.nodejs是什么: nodejs是一个是javascript能在后台运行的平台,具体来时只是使code javascript能在后台运行,因为不在浏览器中运行所以不涉及到document等对象.(Mozilla 则指出 JavaScript 由Core JavaScript 和 Client JavaScript 组成.) 2.nodejs如何运行javascript: n