00:00
看一下,那么类型匹配呢,我们要注意的点,我这里一共大概整理了有这么四点,大家看一看啊第一点。在类型匹配里面呢,大家注意map string int,它是两种不同的类型,其他类推,就是说你里面泛型不一样,在就是说在SC里面呢,他认为这两种是不同的,你你再比如说这样子也是一样啊,比如说这样在SC里面你写一个list in。和list顿,他认为不是同一种类型。好,这一点大家一定要很清晰的知道啊,不然的话,你到时间写代码的时候,你会把它混在一起,你说诶都是历史的,为什么不是呢?因为泛型加进去过后,这个类型呢,就不是同一个了。第二点,在进行类型匹配时,编译器会预先检测是否有可能匹配,如果没有就报错了。这一点请大家注意,就是说有些时候你写这个代码,你会发现诶怎么是错的,那我给大家举一个案例。
01:00
好,我新建一个。包,我们叫做match match类型,匹配类型的一个detail。好的,给同学们看一段代码。代码非常的简单。看一下我这里呢,把这个代码拿过来,大家看一下这段代码放上去直接报错。啊,直接报错,诶有同学同学可能就不太理解了,哎,老师这个怎么会直接报,我我传一个object。他匹配能匹配上就匹配上,匹配不上就算了吗?你看他为什么直接报错了呢?是这样子的啊同学们你看在这里。在这里他说有一个,他说你他发现的是map string这个int,但是他你给的是一个int,所以说他这里就就就就认为是不对的,那么为什么会出现这个情况呢。就是类型匹配之前,编辑他去看一下,他先看你这个object有没有一种可能性,等于它如果根本没有可能性,他就直接说。
02:03
不会匹配到的,所以说你就意思就是说你言外之意说你在写这个没有意义。编译辑我觉得是有点多管闲事的感觉,但是呢,没有办法,他就是这个写法啊,就是我匹配不到我下一个有可能吗?但是编译性他预先就好像这个有点什么呢,就点着急是吧,你说诶你这不不会有啊,你写这个没用啊,这这个有点讨厌,所以说为什么在我前面这样写它是没问题的,为什么前面写没问题,因为我这个IF1句,他一判断他他进去他判断不了了,嗯有些编译他说if服,他懒得判断说啊过,所以说他这个地方呢,你写的很直接,他说嗯,那我不行,我就让你过不了的。编辑很有时候也挺搞笑啊,有时候你看那个错误,你自己也觉得很很很有意思,你不相信你把这个写个if附语句,他有可能就你多写个if钥,他就他就不去判断了啊,因为编译器也是人写的,它底层看到怎么实现所这个地方大家注意一下就行了,就不要去给较劲啊,它它不要去给他较劲,因为理论上说啊,理论上说这种写代码确实也没有意义,因为你这个凹写死了,你在那运行起来不可能改变它的值嘛。
03:08
你你写了一个十,你又不是以复值的方式,你又不是读取的方式,那他这样写其实也能讲的过去,因为你就是不可能等于它嘛,他这样理解也是对的,对吧,他这样理解也是对的,所以说呢,也也能够理解他的这种设计理念,他觉得你这没必要,但是其实你你可以尝试着改一改啊,同学们如果有有兴趣,你在这写个if else里面,即使没有这个map,它可能也过得去啊,可能也过得去啊,你比如说像像我这举个例子,你看这个地方。我写了一个这个类型啊,你看我有一个这个值,你看我写个这个啊,可能他就不会报错。Kiss,我随便写一个啊,Y。Fluent。
04:00
你看。这个地方他就没有报错,其实大家看通过我的判断,我是不可能等于一个float的,对吧,我没有float,但是他也骗过去了,因为他觉得你这个衣服要是懒得去,免得编译了啊,他就他就过啊过,反正有有点搞笑,有时候地方好理解这个细节就行了,虚话我就不多说。啊,注意这个将来有这种情况,你要理解是什么,这个它底层是怎么实现的,第三个一个说明,那么嗯,这个地方呢,这个I,如果我这样写的啊,Object ma I这个case it表示将将这个object类推给I,就是我说的模式中的变量。这就说完了,最后一个看这里,Case下划线出现在match中则表示隐藏变量名,而不是表示默认匹配,这个在前面已经讲过了,比如说我这里有这么一个东西,我在这写了一个下划线,我在这写个下划线表示什么意思呢?就是说你将来如果是传了一个big in,我也能匹配。
05:05
但是这个值我不要了。注意,这种写法没有错啊。你看我们原先一般是这样写什么,比如说我这写一个K,就代表先把你这个先把你这个给我这个object付给这个K,再进行判断是不是他,但是如果我根本对你传进来的这个类型,我不想再去处理了,我只想判断类型,那我也可以直接写个下划线,就说我不,我这里不接收你的类型。好,关于这个这一点呢,就在前面已经说过了,这就叫隐藏变量名。啊,这个叫隐藏病理,我不接收,在case里面我不接收,好关于模式匹配的,呃,四点呢,我就讲到这里啊,也比较简单,也比较简单好了,我把这个呢,给它整理一下就行了。好模式匹配,我跟大家聊了四个地方需要同学们注意的地方,好第一个就是类型上大家注意,诶如果加了泛型呢,这个就不一样了,正是因为这种特性的导致后面我们要去学它的一些上下文界定。
06:12
啊,包括什么逆变,还有还有一个斜变,都是从这地方推导出来的,好了,第三一个刚才说的第三个细节呢,就这里。就是呃,这种写法大家再去理解一下啊,尽管我刚才已经讲过了,我在这呢再多说两句。好的,第四一个我说了一下就是,呃,如果case后面写下划线,那么这个地方就代表什么呢?代表是隐藏变量名,而不代表默认匹配,这点大家要区分出来。好的,关于这四点呢,我们就说到这,我把这个第四个案例给大家简单的截一个图就行了。好朋友们,往这儿放一下。好,把这个放到这边来,还有一个案例我忘了截了,是在第二一个案例我忘了截取哈。
07:06
完了第二个案例呢,我们把这个代码给大家挪过来,在哪里呢?就在这个位置啊,这个地方这个是写的是错的啊。就是这个地方它会报错。诶注意一下它这个地方它会报错,如果保留这个地方会报错啊,如果保留会报错,因为他认为你的这方适应的不会有map。这里如果保留啊,在当前当前这段代码上啊,这段这段代码上啊,如果打开,如果打开,打开这个注释,打开注释。就会报错啊,注释就会就会报错。啊,就会报错,呃,那么原因我刚才已经分析了,就不再多说啊,因为你这给的是in特,他认为你根本不可能进麦,就觉得你写这个没有必要编性,直接用移。
08:03
直接住在这儿,给你挡着。好了,这是我们说的第二一个需要同学们了解的。好,关于类型匹配的细节,我们就聊到这里。
我来说两句