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


目录
相关文章
|
4月前
|
存储 Java
JavaSE——方法(2/2)-方法重载、return关键字在方法中单独使用
JavaSE——方法(2/2)-方法重载、return关键字在方法中单独使用
34 4
|
5月前
|
Java
关键字static与格式访问修饰符详解(代码解释版)
关键字static与格式访问修饰符详解(代码解释版)
|
5月前
|
Java 索引
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
76 0
|
Java
final 类,常量,方法的解释
final 类,常量,方法的解释
83 1
|
程序员 Ruby
“茴” 字的六种写法---l 类方法的七种定义方式
“茴” 字的六种写法---l 类方法的七种定义方式
|
C语言
竟然有人如此解释关键字中的static
竟然有人如此解释关键字中的static
55 0
竟然有人如此解释关键字中的static
JavaScirpt基础break关键字
JavaScirpt基础break关键字
77 0
|
Java 容器 Spring
请举例解释@Required注解?
请举例解释@Required注解?
请举例解释@Required注解?
|
编译器 C++ 开发者
关于前置声明:#include类和前置class类名的区别
关于前置声明:#include类和前置class类名的区别
240 0
关于前置声明:#include类和前置class类名的区别
|
Java
java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系
本文关键词: java continue break 关键字 详解 区别  用法 标记  标签 使用 示例 联系   跳出循环 带标签的continue和break 嵌套循环  深入continue break 跳出双层循环 goto替代   continue和break都用来中断循环,...
1584 0