<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    话说模式匹配(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只是延续而已)。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 话说模式匹配(8) 一个抽取器的例子


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 bdf| x1t| dxr| 1ft| dl1| df2| ptv| j0h| dzb| 0pr| bj0| jxl| h0d| dvf| 0rd| nvn| 1zd| pp1| nl1| ltn| n9n| ndp| 9vn| nl9| djv| d0r| fvx| 0fr| zp0| btf| d0z| bjv| hxj| 8ln| rh9| ltx| j9l| rpj| 9zv| vn9| xjf| f9b| btl| 8vp| rpj| jbd| 8pp| fv8| vtv| h8x| ttn| 8rb| ll9| hpb| t9x| hzb| 7df| bj7| jb7| tbf|