开发者学堂课程【Scala 核心编程 - 进阶:对象匹配基本介绍和快速入门】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9076
对象匹配基本介绍和快速入门
对象匹配基本介绍
1.基本介绍
对象匹配,什么才算是匹配呢?,规则如下:
(1)case中对象的unapply方法(对象提取器)返回Some集合则为匹配成功
(2)返回none集合则为匹配失败
2.应用案例
object Square {
def unapply(z: Double): Option[Double] = Some(math.sqrt(z))
def apply(z: Double): Double = z *z
}
//模式匹配使用,
val number: Double = 36.0
number match {
case Square(n) => printin(n)
case _=>println("nothing matched")
}[案例演示+代码说明+总结]
在这段代码中,写有 object,还有 unapply 方法和 apply 方法进行实现和重写。
Apply 方法是去构建或者初始化,是一个构造器。Unapply 是提取器,拆解一个对象,如上 unapply 后写了一个参数,接收一个 double 类型,然后返回了一个option[Double],option 是一个集合,里面可以存放double。
然后返回了一个 Some,里面写 math.sqrt(z),是将传入的z进行开平方,然后将开平方的结果放到 Some 集合中。
如果 apply 返回的是一个 Some,就匹配成功。
我们试着来运行,先来创建一个Scala Class名为MatchObject,类型为Object,
创建完成后代码完整如下:
package com.atguigu.chapter12
Object MatchObject {
def main (args:Array[String]):Unit = {
//模式匹配使用,
val number: Double = 36.0
number match {
//说明case Square(n)的运行的机制
//1.当匹配到case Square(n)
// 2.调用square 的unapply(z: Double) ,z的值就是number
//3.如果这个对象提取器unapply(z:Double)返回的是Some(6),则表示匹配成功,同时将6赋给Square(n)的n。
将上述代码val number: Double = 36.0改为val number: Double = Square(6.0)更易理解
case Square(n) => printin(“匹配成功n=” + n)
case _=>println("nothing matched")
}
}
}
object Square {
//说明
//1. unapply方法是对象提取器
//2.接收z:DoubLe类型
//3.返回类型是option [ Double]
//4. 返回的值是Some(math,sqrt(z)) 返回z的开平方的值,并放入到Some(x)
def unapply(z: Double): Option[Double] = {
Some(math.sqrt(z))
}
def apply(z: Double): Double = z *z
}
接着来运行查看结果,由于代码def unapply(z: Double): Option[Double] = Some(math.sqrt(z))
说明一定会匹配 some
结果显示:
匹配成功n=6.0
如果代码写的不是36,而是更形象的传入6.0,例如val number: Double = Square(6.0),再运行结果依然是 匹配成功 n=6.0。
如果传入的是5.0,那么结果就显示的是5.0。
来测试一下是否触发了 unapply 方法,在代码def unapply(z: Double): Option[Double] = {下输入
println(“unapply被调用 z是=” + z)
猜测应该是被调用一次,
运行结果显示:
unapply 被调用 z是 =25.0
匹配成功 n=5.0
再来演示返回none集合则为匹配失败案例,注释掉代码Some(math.sqrt(z)),输入None,会发现直接返回的是nothing matched匹配失败,
运行结果显示
unapply 被调用 z是 =25.0
nothing matched
仍然调用了 unapply,因为动作依然需要去做。
返回 None 匹配不成功,就不执行代码 case Square(n) => printin(“匹配成功n=” + n)
以上就是对对象匹配的基本介绍。