模式匹配(7) case类的匹配

举报
xenia 发表于 2019/12/15 16:35:55 2019/12/15
【摘要】 前一个文章中的guard 在case子句中加上自己的逻辑。是match的语法。 和前面的case 匹配的类型,或者匹配的某一定规则的泛式不可混为一谈。(吃了亏要谨记)言归正传,接着说case类的匹配。在第二篇中scala怎么实现模式匹配中说到,case class 类型自带unapply 方法,用于解构对象。或者我们自定义的提取器,定义一个unapply 方法,用于提取和解构。其实所有的un...

前一个文章中的guard 在case子句中加上自己的逻辑。是match的语法。 和前面的case 匹配的类型,或者匹配的某一定规则的泛式不可混为一谈。(吃了亏要谨记)

言归正传,接着说case类的匹配。

在第二篇中scala怎么实现模式匹配中说到,case class 类型自带unapply 方法,用于解构对象。或者我们自定义的提取器,定义一个unapply 方法,用于提取和解构。

其实所有的unapply 方法都返回Option[TupleN[...]],这个地方的N表示可以从对象中提取的值的个数。

因为unapply方法可以“否决”这个匹配,这时方法返回就为None。这个时候scala会使用下一个case 子句。

在第4篇中我截取了+: 类型实现提取的源码 。

其中unapply方法如下:

def unapply[T,Coll](collect: Coll) :Option[(T,coll)]

头部的类型被推断为T,尾部被推断为某种集合类型。Coll同时也是输入参数的类型。 所以我们可以看到,返回的Option 其实即是 输入参数的头部的提取,和尾部组成的两个元素元祖。

对于seq序列,希望提取时返回非固定数量的元素,seq 提供了 unapplySeq 方法实现,源码如下


注释中我们可以看到, 这个方法就是在模式匹配的时候被调用。

这个方法接受一个集合类型参数,返回此集合类型参数的Option对象。对于在和中场景中会使用到呢?如下:


在模式匹配Seq(head,head2,_*) 的时候,其实是去调用了seq的unapplySeq 方法,提取其中的部分;

以上是scala 自带的unapply 和unapplySeq 方法在模式匹配中用于提取或者结构的相应作用。

对于自定义的case class 中自定义的可变参数的提取模式的匹配有如下用法:


其中反编译scalac 自动生成的代码发现,


哈哈哈 也是去实现的unapplySeq方法。。



本文转载自异步社区

原文链接:https://www.epubit.com/articleDetails?id=NC7E3EF943020000175461A5120801F5B

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。