Step into Scala - 16 - 样本类与模式匹配

目录

摘要

样本类概念,建立样本类,使用样本类,构造方法与 toString(),模式匹配,模式匹配中的表达式,匹配值,匹配类型,try…catch,匹配样本类

样本类与模式匹配

样本类 Case Class

特点
  • 样本类是使用关键字 case 声明的类
  • 可以隐式调用构造方法进行初始化
  • 样本类默认基于构造方法实现了 toString(), equals()hashCode() 方法,不在构造方法中定义的属性不会产生在 toString() 结果中。
  • 样本类可以直接使用 ==进行比较,同样不在构造方法中定义的属性不会用在比较上
创建样本类
case class Sum(e1: Expr, e2: Expr) extends Expr {
  val comment: String = "comment"
  def eval: Int = e1.eval + e2.eval
}
使用样本类
abstract class Expr {
  def eval: Int
  def calc: Int = this match {
    case Number(n) => n
    case Sum(e1, e2) => e1.eval + e2.eval
  }
}

case class Number(n: Int) extends Expr {
  var comment: String = "comment"
  def eval: Int = n
}

case class Sum(e1: Expr, e2: Expr) extends Expr {
  var comment: String = "comment"
  def eval: Int = e1.eval + e2.eval
}

//隐式调用构造方法
val result = Sum(Sum(Number(1), Number(2)), Number(3))
println(result) //Sum(Sum(Number(1),Number(2)),Number(3))

Sum(Number(1), Number(2)) == Sum(Number(1), Number(2))) //true

val num = Number(1)
println(num.n) //1

val sum = Sum(Number(3), Number(4))
println(sum.e1, sum.e2) //(Number(3),Number(4))
println(sum) //Sum(Number(3),Number(4))

模式匹配

特点
  • 模式匹配类似 switch 但是功能更加强大
  • 模式匹配可以匹配值,类型(包括样本类)
模式匹配中的表达式

模式匹配中可以使用的表达式类型

  • 构造器类型,用于进行类型匹配,匹配与此其相似的构造器
  • 变量,匹配任何值,且将匹配的值设置到此变量中
  • 通配符 _,匹配任何值
匹配值
val times = 1
val result01 = times match {
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}
println(result01) //one

val result02 = times match {
  case i if i == 1 => "one"
  case i if 1 == 2 => "two"
  case _ => "other"
}
println(result02) //one
匹配类型
def matchType(o: Any): Any = {
    o match {
      case i: Int if i <= 0 => i - 1
      case i: Int => i + 1
      case d: Double if d < 0.0 => d - 0.1
      case d: Double => d + 0.1
      case str: String => "str is " + str
      case _ => "other"
    }
}
try…catch 中的模式匹配
def matchTryCatch: Unit = {
    try {
      throw new NullPointerException
    } catch {
      case e: NullPointerException => println("null object")
      case e: IndexOutOfBoundsException => print("index out of bound")
    } finally {
      println("finish")
    }
}

面向表达式的写法

def matchTryCatchFaceExp: Unit = {
    val result: Unit = try {
      throw new IndexOutOfBoundsException
    } catch {
      case e: NullPointerException => println("null object")
      case e: IndexOutOfBoundsException => print("index out of bound")
    } finally {
      println("finish")
    }
}
匹配样本类
abstract class Expr {
  def eval: Int
  def calc: Int = this match {
    case Number(n) => n
    case Sum(e1, e2) => e1.eval + e2.eval
  }
}

case class Number(n: Int) extends Expr {
  var comment: String = "comment"
  def eval: Int = n
}

case class Sum(e1: Expr, e2: Expr) extends Expr {
  var comment: String = "comment"
  def eval: Int = e1.eval + e2.eval
}

def eval(e: Expr): Int = e match {
  case Number(n) => n
  case Sum(l, r) => eval(l) + eval(r)
  case x => x.eval * 10
}
println(eval(Sum(Number(1), Number(2)))) //3
println(eval(new Expr {
  override def eval: Int = 20
})) //200
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值