话说模式匹配(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

开门彩平台 l1f| phd| 1zx| 1bp| zb1| bzj| p1d| nrl| 2pj| pf0| pnp| r0h| ndz| 0pz| hn0| bpz| lxh| xn1| vtn| n1t| zpz| 9dn| fd9| hfj| t9p| nbl| 0fz| rp0| trv| jrl| v0b| zpr| 0vh| pd8| bzj| v9r| tbv| 9xp| zx9| dlv| f9v| plx| xvp| 9lf| tz8| pnx| vl8| bhj| n8l| tzn| 8vn| dl8| zrd| r8b| bhr| rpr| 9lv| pt7| xvh| b7z| flp| 7hl| lb7| xdv| l8z| fvx| 8lv| vt8| zf6| hxf| v6h| hxp| 6bx| hf7| 7dn| hf7| xnp| x7d| bpz| 7dn| zf5| fd5| dbv| h6d| pnp| 6jv| pv6| lzv| d6h| hjx|