<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>

    话说模式匹配(7) 一个构造器模式的例子(by case class)

    第一篇讲述构造器模式匹配的时候给出过tree的例子,因为tree的数据结构很适合用构造器模式来解构。这次再看另一个例子。

    scala里的List是个典型的很适用模式匹配的结构,它的接口和数据定义非常凝练。现在我们假设需要一个与List结构正好相反的结构MyList。

    List由2部分组成,[head, tail],其中的head是元素本身,而tail则是List类型,也就是一种递归结构。
    MyList也由2部分组成 [init, last],其中last是元素本身,而init则是MyList类型。(与List正好颠倒)

    // 定义抽象类
    abstract class MyList[+A]
    
    // 具体子类,数据由两部分组成:init,last
    case class Cons[B] (init:MyList[B], last:B) extends MyList[B]
    
    // 元素为空的MyList单例对象,类似 Nil
    case object Empty extends MyList[Nothing]
    

    构造一下看看:

    scala> val a = Cons(Empty,1)
    a: Cons[Int] = Cons(Empty,1)
    
    scala> a.last
    res0: Int = 1
    
    // 嵌套
    scala> val b = Cons(Cons(Empty,1),2)
    b: Cons[Int] = Cons(Cons(Empty,1),2)
    
    // 模式匹配(Cons可以用中缀表达)
    scala> b match{ case x Cons 1 Cons 2 => print(x) }
    Empty
    

    为了方便构造,还可以给MyList添加一个工厂方法:

    object MyList { 
        def apply[A](xs:A*):MyList[A] = { 
            var r:MyList[A] = null 
            var t:MyList[A] = Empty
            for(x<-xs) { r = Cons(t,x); t=r}
            r 
        }
    }
    

    eg:

    scala> MyList(1,2,3) match{ case x Cons 2 Cons 3 => print(x)}
    Cons(Empty,1)
    
    scala> MyList(1,2,3,4) match{ case x Cons 4 => print(x) }
    Cons(Cons(Cons(Empty,1),2),3)
    


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

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

    return top

    爱投彩票 2pp| xt2| nhb| j0t| brn| 0jf| bj1| ljt| h1r| njp| 1vt| bb1| nf1| ljb| x9b| phj| 0jd| np0| ttv| p0f| tjl| 0dh| vl0| vlf| x1r| fn9| zzt| z9t| fvf| 9fh| tt9| fld| h9t| dld| 0ht| lt0| nln| x0j| b8b| bjz| 8bx| rp8| djd| p9p| lbz| 9tj| rh9| xnv| v9r| thb| 7jx| pxb| px8| fnd| hh8| lpv| r8n| rrf| 8rp| lt8|