Desugar Scala(15) -- unapply和unapplySeq方法
来源:互联网 发布:巫师三优化 编辑:程序博客网 时间:2024/06/06 00:40
欢迎关注我的新博客地址:http://cuipengfei.me/
实在想不到什么动词可以当做脱衣服来讲了,所以从现在开始这系列博文就叫做Desugar Scala了。除非哪天才思泉涌,又想到了新词:)
开始正文。
名字叫做unapply和unapplySeq的方法在Scala里也是有特殊含义的。
我们前面说过case class在做pattern match时很好用,而除case class之外,有unapply或unapplySeq方法的对象在pattern match时也有很好的应用场景。
比如这段代码:
我们定义了一个unapply方法,用来计算平方根。 我们可以像调用普通方法一样的调用它:
这样会得到36的平方根:6。实际上返回值是Some(6)。
上面的方式是对unapply的浪费,unapply真正的好处是这样的:
这样我们无需显式调用unapply方法,而把是它用在pattern match中,让编译器替我们调用它。
当我们写下这段pattern match的代码时,编译器其实替我们做了好几件事:
- 调用unapply,传入number
- 接收返回值并判断返回值是None,还是Some
- 如果是Some,则将其解开,并将其中的值赋值给n(就是case Square(n)中的n)
这段代码反编译出来是这个样子的:
如果没有unapply方法和pattern match语法之间的这种结合,我们自己写代码要写成什么样子呢?
或许会比上面反编译的代码简单一些,但是显式地调用开平方的方法,用if else来判断Option,以及将真正的返回值从Option里面解出来这三件事是免不掉的。
unapplySeq和unapply的作用很是类似,例如这样:
我们定义一个unapplySeq方法,用逗号作为分隔符来把字符串拆开。
然后我们可以这样应用它:
与上面的例子很是类似,不过编译器在这里替我们做的事情更多了:
- 调用unapplySeq,传入namesString
- 接收返回值并判断返回值是None,还是Some
- 如果是Some,则将其解开
- 判断解开之后得到的sequence中的元素的个数是否是三个
- 如果是三个,则把三个元素分别取出,赋值给first,second和third
如果没有unapplySeq方法和pattern match语法之间的这种结合,我们自己写代码来做这五件事会显得很是繁琐。
- Desugar Scala(15) -- unapply和unapplySeq方法
- 提取器 unapply 与 unapplySeq
- scala中的apply和unapply
- scala中的apply方法与unapply方法
- scala 的apply,update,unapply方法
- apply方法和unapply方法
- scala unapply的测试
- Desugar Scala(16) -- Lower Bound
- Desugar Scala(17) -- Option和for,以及脑子里发生的事情
- scala学习笔记:match与unapply()
- scala 随笔(7)unapply 解析
- scala 知识总结 apply与unapply
- Scala方法和函数
- 学习Scala:Scala中的字段和方法
- scala中的函数和方法
- Scala中的方法和函数
- Scala中的方法和函数
- scala的 apply方法和update方法
- LeetCode: Count and Say
- C primer plus 第二章
- Java 接口应用案例 (策略设计模式使用)
- poj 1180 Batch Scheduling(DP-单调性优化)
- uboot 环境变量实现简析
- Desugar Scala(15) -- unapply和unapplySeq方法
- 创建本地yum源的三种方法
- uboot移植与源码分析总结(3)-Serial驱动分析
- Mongoose源码分析:外篇之web服务器
- 关于如何打开谷歌的电脑设置方法
- Mongoose源码分析:Intoduction and Installation
- [C] sizeof居然不是函数是运算符
- 用libevent多线程方式实现echo server
- JAVA基础----java中E,T,?的区别?