话说模式匹配(8) 一个抽取器的例子

简介:

一个抽取器的例子

目前List的序列模式(sequence pattern)可以支持对前边若干元素的匹配,比如:List(1,2,3,_*),如果想要实现 List(_*, lastEle) 这样的形式,就需要通过自定义一个抽取器来实现了


// 自定义Extractor
object Append {
    // 接受List结构
    def unapply[A] (l: List[A]) = {
        // 返回Tuple2:前边的若干元素和最后一个元素
        Some( (l.init, l.last) )
    }
}


抽取器里的unapply方法,入参对应你想要进行匹配的对象,出参则是解构后的元素。
比如 list match { case Append(x,y) => } 里面的list对应unapply的入参,x,y对应unapply方法的出参。

为什么unapply方法的返回结果大多都使用Some包装一下,这其实是unapply方法返回值的一些约束

  1. 返回Boolean,那么匹配时 case A() 里面的true不用写(也不能写)
  2. 若原本想要返回类型为T,则使用Option[T],这样是为了匹配时能够判断是否成功,Some[T] 成功,None不成功
  3. 若原本想要返回一组T1,…Tn,则使用Option[(T1,…Tn)]

现在看看上面自定义抽取器的使用例子:


scala> (1 to 9).toList match{ case _ Append 9 => println("OK") }
OK

scala> (1 to 9).toList match{ case x Append 8 Append 9 => println("OK") }
OK


上面使用了中缀写法,也可以写成普通的构造方式,只是看起来没有上面的舒服


scala> (1 to 9).toList match{ case Append(Append(_,8),9) => println("OK") }
OK


另外,如果觉得Append这个名字太啰嗦,抽取器object单例名称也可以用符号表达,比如用”:>“来表示


object :> {
    // unapply ...
}


这样对匹配时的表达显得更简短一些


scala> (1 to 9).toList match{ case x :> 8 :> 9 => println("OK") }
OK


另外,以”:“结尾的符号支持从右到左的操作方式,List的子类就采用了“::”这样的名称,以方便模式匹配(当然也是因为早期的一些函数式语言里,如ML里已经定义了::的形式,scala只是延续而已)。

目录
相关文章
|
4月前
|
Python
【已解决】如何用正则提取小括号的内容
【已解决】如何用正则提取小括号的内容
86 0
|
7月前
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
79 0
|
7月前
|
监控 JavaScript 前端开发
|
7月前
|
数据采集 自然语言处理 JavaScript
正则表达式的神奇世界:表达、匹配和提取
正则表达式的神奇世界:表达、匹配和提取
96 0
excel中提取双引号之间的数据、提取括号中的数据
excel中提取双引号之间的数据、提取括号中的数据
|
机器学习/深度学习 计算机视觉
基于自正则原型网络的小样本语义分割
基于自正则原型网络的小样本语义分割
182 0
基于自正则原型网络的小样本语义分割
|
机器学习/深度学习
【关于正则表达式的特殊符号的处理】之前自己在提取一个表达式一直提取不到,后来解决了,记录下知识点
1.开始的表达式:"drugLicenseCompanyperson":[{"pk":"(.*?)" 2.修改后的表达式:"drugLicenseCompanyperson":\[\{"pk":"(.*?)"
|
自然语言处理 算法 计算机视觉
pyhanlp 共性分析与短语提取内容详解
HanLP中的词语提取是基于互信息与信息熵。想要计算互信息与信息熵有限要做的是 文本分词进行共性分析。在作者的原文中,有几个问题,为了便于说明,这里首先给出短语提取的原理。在文末在给出pyhanlp的调用代码。
3701 0
fbh
less学习-模式匹配和导引表达式(带参数混合2)
有些情况下,我们想根据传入的参数来改变混合的默认呈现,比如下面这个例子: .mixin (@s, @color) { ..
fbh
1076 0