Scala学习(七)——Apply和Unapply

Scala学习(七)——Apply和Unapply

本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(七)——Apply和Unapply
简介

applyunapply指的是持有这两个名字的方法,对于这两个方法,Scala编译器做了一些特殊的设定,赋予了它们特殊的意义,让它们看起来更好看一点。

从数组讲起

在前面的内容里,我们已经定义过数组了,但是还从来没有介绍过如何使用数组,在这里补齐一下:

刚接触Scala的人一定很疑惑为什么使用()而不是常用的[]作为数组访问符号,虽然说[]已经被用于泛型。实际上呢,Scala根本就没有(有特殊语法的)数组,有的只是Array类,用小括号访问数组的思路,其实就是使用了apply

apply

某种意义上讲,apply方法其实是对()的重载,作用是给对象赋予可被调用的特征:

最后三句等价于:

当然,apply函数可以是任意参数,任意返回值,同时也可以存在多个不同参数的apply函数。

update

update方法是对()=的重载,作用是修改通过apply获得的值:

同样也可以有任意参数,任意返回值,任意重载。

unapply

unapply方法应当apply方法的逆操作,其输入是apply的返回值时,输出应当是apply的参数。unapply方法的用处在于以前提到过的match语句。

上面这一例程序中,AFactory对象同时有applyunapply方法数,其中apply方法可以构造一个AClass类型的对象,unapply方法可以从这个对象中提取出构造时输入的值。正是有了unapply方法,下面的match语句才可以判断a是否是apply方法的输出值,并且获得原始的参数。
有关unapply方法本身,值得注意的地方有两点。一是输入参数为一个,类型为Any,这样才可以保证对所有对象的match语句有效。二是输出类型为Option[T]类型,其中T是原参数的实际类型。Option类型暂不细讲,会在以后说明。这里如果匹配成功,就返回用Some包含的参数,如果匹配失败,则返回None对象。
如果原始apply方法的参数有多个,那么unapply就不够用了,需要使用unapplySeq,意义是相同的。具体用法见下面这个例子:

当然,unapplySeq的功能是unapply的超集,但是效率可能稍低,所以可以用unapply的地方还是尽量用。

总结

调用applyunapply的语法格式其实只是语法糖,但是如此简单就可以使用工厂模式,何乐而不为呢?更何况还可以有模式匹配的支持。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据