00:00
那现在呢,我们今天继续学习match,那match呢,我们后面还有一部分内容没有讲完的,继续接着讲解,那现在呢,我们来讲match匹配里面的一个重要的知识点叫对象匹配。对象匹配,那么首先我们来看一下就是对象匹配,对象匹配那么首先要先给同学们聊一聊什么叫做对象匹配这个话题,也也就是说什么情况下我们才认为是对象匹配上了,那大家看我这句话啊,对象匹配首先要研究第一个问题,什么才算是匹配上了呢?好,这个是看的设计者,他规定的这个做了一个规定,什么规定呢?他说case中的对象的on ona apply方法的提取器。好,这个我们前面学了一个方法叫apply,现在呢又提出一个ona apply方法,这个是一个逆向的操作。
01:00
这个叫什么呢?这个也有一个专门的术语,叫做对象提取器,叫对象提取器啊,后面呢,我们还会具体取令啊,这是对象提取器,就这么一个玩意儿。好,那这它是干什么的呢?好,我觉得对象提取啊,这前一的啊叫对象提取器,那么如果说我们写的这个on apply方法,也就是对象提取器,它返回的一个sum集合大写。Sum集合,我们就认为匹配成功了。啊,这是它的一个规定啊,不是我规定的,就是它的语法层面,就是说如果你的对象,呃,去这个apply返回这个sum,结果就代表对象匹配成功了。那如果说你返回了一个梦?啊,返回的一个嫩,那么它返回一个嫩,这个集合呢,就代表匹配失败了。啊,就这么简单,那这样讲了过后,大家肯定还是不明白,这样子啊,我们先马上举一个例子,举,举完一个例呢,我们做代码说明和总结,大家就很轻松的知道了,好,同学们看这段代码,这段代码非常的简单,我们先给他搂一看一下,大家看这里我写了一个object。
02:13
我写了一个object,这个我们前面讲过这一个square里面呢,有一个on apply方法,还有一个apply方法,这些呢就是从这边进行进行这个实现和重写的,那这个apply呢,Apply这个方法大家我就不多说了。它是干什么的,它是去构建或者是初始化,我们一个它其实一个就是一个构造器啊构造器,那这个onpla呢,听这个名字大家也猜的出来,你这个是构建一个对象,那么我这边就是一个拆解一个对象。啊,或者叫做提取器,那么这里面呢,大家看这里,我这里写了一个参数。我接收一个double类型。我接收一个double,然后这个地方我返回了一个叫做option double,这个option呢,大家看option也是一种集合,里面可以存放double,这是我指定的,然后呢,我这返回的一个sum里面写了个mass.sc就是我把你传进来这个Z,你这个Z不是传进来了吗?我把你这个Z进行一个呃平开平方。
03:20
然后我把这个太平方的结果先放到这个sum里面去。好,那现在呢,这个如果这个PLA返回的是一个sum就匹配成功,好现在呢,我们来看一下这个代码啊,代码非常简单,我给同学们运行一下。代码分享简单,然后呢,我做一些注释,帮助同学们理解,来吧,我们新建一个SC文件,叫做match object object,然后呢,我写一个。另啊,写一个这个工具在这组函数。好总函数,然后呢,我先把代码放到这啊,我先做点说明,这个肯定不是在这写的,我做点说明来吧,同学们好,说明如下,第一点呢,同学们,你们现在看到的LY呢,它这个这个这个地方我我我说明刚才是写到这对应的位置,这样大家看起来比较清晰一点。
04:17
好呃,因为第一次见,我稍微第一次写的稍微详细一点啊,Apply方法apply方法是什么呢?是我们叫做对象提取器。提取器。提取器啊好,这是第一个,它的概念要要很清晰,就是说别人问这是干什么的啊,那么它可以这里我写的是他可以接受一个double类型。这里我写的啊,不是说不是说所有的PLA都是接触一个double,这是我写的。就好像你apply一样,你也不一定传的是double嘛,啊这个地方他接收什么呢?他接收接收一个z double这样的类型。好,这是第二个,第三点呢,大家可以看到返回的是一个option,这个option是个集合,我们进去看一下。
05:06
它是这么一个集合,它扩展至,然后呢,实现了这个的一个接口。OK,那么呃,里面这个泛型我指的是double,也就是说这里它返回的类型是什么呢?返回类型,返回类型是这个玩意儿option。All person。招double啊,这是它一个类型,这是这是这个类型,然后呢,这里我写了一句话,我写了什么呢?我返回的是这么一个集合,这个集合是什么呢?就是把你传入的这个Z。我进行开平方,然后返回一个上,这是我自己写的,我认为就是你传进来,我就给你返回上。好,那这个地方我写的是什么呢?就是返回具体的值啊,返回的这个值是怎么计算呢,是上。我把你的传进来的一个一个Z啊,OK,你这个Z给我了,我就返回它的G,返回什么呢?返回这个Z的开平方,开平方啊开平方。
06:15
呃,开开平方的值,并放入到,哎,并并放入到哪里呢上。集合中。这个组之间,好,这个写完了以后呢,那我们来快速的用一用啊,这个用起来大家一看就明白了,大家看我在这里模式匹配,我在这里先写了一个double。我在这里先写了一个double,大家一看就是double,我故意写了3.3 36.0。啊,就三十三十六嘛,36,然后呢,我在这里写了一段,哎,这个是多了一好像啊这方我用match匹配,那么。Number,呃呃,这个呃member呢,就是是哪里呢?是我这里传进去的给他的,好这里面最难的地方是在这里,同学们就这句话要特别的理解一下,我要做一个说明,就这个地方是干什么呢?好注意听啊注意听。
07:13
好,这个地方是这样子的,当我们传入一个这个number值,到这时,当匹配到这个地方时,他会做件什么工作,这这个东西很重要。这个是它的一个运行的啊,运行的一个机制的说明啊,机运行的这个机制的说明,我说几点啊第一点。当当匹配,当匹配到这个值时,当我们执行到这句话时,可以这样理解。这句话是,那么我们是怎么做呢?它首先会去调用,注意听啊,它就会去调用系统,我们再就会调用什么呢?调用这一个square的就是这个的哪个方法呢?Ona apply方法。
08:05
这个方法,他会去调用他的这个方法。那么这个方法传进去的值是什么呢?这个它会把36第二步啊,就是这个你传的36会传给这个Z。注意听啊,这个有点不好理解啊,它是一个逆向操作的,然后干什么,这个Z的值,这个Z的值就是什么呢?是这个number的值。就是这个numbers。好的,这个大家看啊,就是它会自动的触发,待会我在这打一句话,你们就看出了,就是它只要看到你这写的一个这个构造的构造的一构造就是构造器的一个方式,它反而执行的是ona platform方法,这是它运行机制规定的。啊,大家可能会觉得,诶,是不是把这个垃圾进行一个勾结错了。刚好是相反。他会去调用这个square on apply方法,当然你前提是写了,那么这个地方传这个Z呢,就是你这个number啊,这个地方从代码上是看不出来的,然后呢,第二个第第三个问题就来了,说老师,那你这个N是什么呢?注意听。
09:11
这个是N是这样子的啊,如果返回到注意听如果如果返回到就是如果这个啊,如果你这个方法,注意听这句话有点有点稍微的麻烦一点啊,如果这个对象提取器,如果这个对象提取器。啊,这个叫提取器,提取器就它返回的是什么呢?返回的是这样一个值,返回的是sum。里面有一个具体的值,比如说这个值,呃,具体值你是多少就是多少,你比如像我,像我们现在我们就具体画一下,你传的是一个36,显然我这边返回的就是九了。呃,666,对对不起啊好,返回来是这个上六则表示什么呢?注意听则则表示匹配成功,注意听这句话啊,则表示匹配成功,因为这个他他认为你匹配成功,就是你要返回一个sum这样的集合,只要返回一个sum就表示匹匹配成功,同时注意听这话啊,同时这句话很重要,同时系统会将干什么呢?同时将。
10:20
将什么呢?将这个sum里面这个六,将这个六付给。付给谁呢?这个square里面这个N就相当于把它反提付给这个square里面的这个N,就相当于把它重新提取出来了,你你想一想,你原先这个36是怎么构建的,比如说如果我写的更直接一点,这样子可能大家理解的更到位。就是说如果我这样原先构建是这样构建的SQL,我写个六这个大家可能就更好理解了,就说我原先构建的这个double,我构建的这个square是个什么呢?是呃,传的是6.0构建的,那现在它。
11:05
他反其道行之,又把你这个六给你重新拎出来了。说白了,它是对象提取器,它是为什么管它叫对象提取器呢?它就是它要提取你原先这个传入,就是你你原先构建这个对象的时候,你传入的一个参数是什么。他是要干这么一件事情,但是有些同学说,说老师这个好无聊了,这个很有聊啊,这个很有用,后面你发现这个特别有用,所以说再次体现出他的一种这种这种体现,就是说原先你的构造技式这样构建的,他一旦用这种方式就把你原先这个。这个你里面写的这个纸,重新给你提到这个N。就这么简单,当然有同学老师,那这个不是一二就看出来了吗?因为有些时候我们将来是一个就是我们写的那个对象啊,它是一个比较综合的,那在代码比较多的时候,这个对象提取器就特别的有用。好,这样子我们来运行一下,同学们看看现在目前应该输出什么呢?好,因为目前我这里是写死的。
12:08
我写死的就是要返回一个sum,那他一定会匹配上,如如果说我们写的更严谨一点,可能是如果怎么怎么样,再怎么怎么样啊,在这里我写的是写死的,肯定它始终是能匹配上的,好我们运行一下,这里面应该直接返回一个,我这再再写一下啊,这个时候它会它会提示匹配成功,我就写啊匹配成功,那么N等于多少?好,这个时候应该是匹配成功,N等于6.06.0,好,我先写成这个啊,写成36.0。好同学们,我们运行一下跑一个代码,我们发现呢,代码跟我们想象的应该是完全一样的。匹配成功,N等于6.0,当然如果我写的不是这个36,我直接以这种更形象的方式来给他传一个这个东西,同样也是把你这个6.0给你拎出来。
13:01
再变形,你看这个地方仍然给你把这个拎拎出来了。也是它当然有些动作是,如果我传的是5.0呢,那提出来就是5.0。那提出来就是5.0。你看这方我们提出来是5.0,而且我们来测试一下是不是真的触发了我们这个apply方法呢?怎么证明这个事呢?非常的简单,我在这里来给大家说出一句话,就说on apply方法被调用了。好,这个底层呢,我就不去追了啊,追的话那个代码太其实也也不难,其实它底层就是做了一个包装而已,就是把这个就是类似于我们隐私函数做了一个包装而已。好,那现在我写一个这个UN play方法被调用,被调用注意听啊,把这写一下,那么Z是什么呢?把这个证明一下就完事了啊,这输出来这个Z呢,就是你这传进来这个值是多少就是多少,这个number是多少就是多少,好那么我们可以看到应该被调用了一次。应该被调用了一次。
14:00
果然如此,按play被动Z是25.0,就是你这传进来的,因为你五点你这构建完了过后5.5,你是你构造的时候是Z乘以Z嘛,然后呢,你这5.0乘以5.0不就不就25嘛,好,这就是一个基本的原理啊啊同学们看看能不能理解。那当然有同学老师这个你这个感觉还是有点隔山打牛的感觉,你虽然写的很细致,123还是有点,好像有点虚无缥缈,但是我告诉大家,有些时候你完全没有想象力也是不行的,比如说我们前面讲这个影视函数影视值的时候,其实我也是把代码给你看一下,其实它就是底层做了一个包裹,他不会说说完全没有这个关系,只是从语语法层面上呢,他做了很多包装。对吧,你看我们原先写写这个,写写这个影视函数,我写了这样一个东西,大家还有印象吧,我这样写的,我说number double,我写了一个int。我写了一个int,然后呢,我传了一个2.3.4,这个进不去,当我写完一个影视参数的时候,其实它的本质就是把它包起来。
15:07
点突了一个int啊,这这个大家能够就是说去想象它里面肯定是就是做包装了。啊,做了做了一个包装,就是把你这个square呢调到这边来了,可能是square点什么apply方法,仅此而已啊,仅此而已,好同学们,这这个最基本的案例我就给大家先讲到这里啊讲到这里好同学们先把对象匹配的基本使用给大家板述一下,然后呢,我们就开始讲一下呃,他注意的地方,好吧,同学们好,现在呢,我们来说一下对象匹配的这个内容。好,同学们,对象匹配,我刚才做了一个基本的介绍。基本介绍,OK,那基本介绍呢?我首先说了一个基本介绍的概念。好啊,首先明确了先开篇名义,就什么叫对象匹配这一点如果搞不清楚,那你听的时候就会很懵。
16:03
哎,所以说值,如果它返回的是一个呃,Sum集合,那就是匹配中,如果返回是no呢,代表匹配失败,那我再把这个演示一下。再把这个撕掉好,这次呢,我故意返回一个这样的东西啊,我二话不说我什么,我我就给你返回一个no。NONE。啊就返回一个诺啊,这个嫩嫩啊,就能嫩嫩返回一个嫩,那么这个嫩呢,也是option,它满足这个满足这个这个结构你不能随便返回一个值啊说老师我随便返回一个行不行,你随便返回一个,你随便写一个试试看看,你写个一他语法他是他就过不去,因为它不是option的。啊,他不满足这个它的一个子类,那你就跑不过去,好,如果我我这时就无论说就给你返回一个嫩,你会发现它直接返回的是not啊,Nothing match。这就体现出刚才老师讲的哪个知识点呢?如果返回的是这么一个玩意儿啊,这么一个玩意儿,那么它就匹配失败了。
17:00
匹配失败和匹配成功是人家规定好的啊,这个规则是人家规定好的。那我们来走一个好,同学们看,这个时候呢,它直接返回的是nothing much。他仍然调用这个安了。因为你这个动作他还是要去做的,只是因为你返回的不是这个sum,因此它就给你。跟你这个这这个这给你认为是不匹配的,那么他就底层呢,他就说诶这个补匹配成功,他就不不跳过去,然后就跳到这个默认的了啊,就是我这写的这句话看啊,如果提取器返回的是这个,则表示匹配成功,如果返回的是嫩呢,就表示不成功啊把这句话写到这。好好,这个第一个我稍微慢一点,后面呢就直接拿过来用啊,如果返回的是。这个。它如果返回的是什么玩意儿呢?如果返回的是嫩,那嫩no则表示匹配不成功。不成功,当然不,既然匹配不成功,那下面代码就不执行了。就接着往下走,好这个,呃,这个我们又多说了两句,然后呢,把这个基本快速入门案例写进来,快速入门案例给大家聊了一下,这个后面同学们用的很多啊,我再说一遍,一定要把它理解清楚到位。
18:13
啊,至少从语法层面上把它理解清楚到位,我把这个代码呢,给各位朋友板书到咱们的笔记中去。欧了。了解。好,这是我们对象匹配的一个基本介绍。
我来说两句