代数数据类型和模式匹配
代数数据类型是一种复合类型,指由其它数据类型组合而成的类型。两类常见的代数类型是积类型(如 struct、tuple 等)与和类型(如 tagged union)。
在此我们着重介绍仓颉的和类型enum,以及对应的模式匹配能力。
在下面的例子中,enum 类型 BinaryTree 具有两个构造器,Node和Empty。其中Empty不带参数,对应于只有一个空节点的二叉树,而Node需要三个参数来构造出一个具有一个值和左右子树的二叉树。
| enum BinaryTree { | Node(value: Int, left: BinaryTree, right: BinaryTree) | Empty} | | ------------------------------------------------------------------------------------------ |
访问这些enum实例的值需要使用模式匹配进行解析。模式匹配是一种测试表达式是否具有特定特征的方法,在仓颉中主要提供了match表达式来完成这个目标。对于给定的enum类型的表达式,我们使用match表达式来判断它是用哪个构造器构造的,并提取相应构造器的参数。下面的例子中,递归函数sumBinaryTree实现对二叉树节点中保存的整数求和。
| func sumBinaryTree(bt: BinaryTree) { match (bt) { case Node(v, l, r) => v + sumBinaryTree(l) + sumBinaryTree(r) case Empty => 0 }} |
|---|
除此enum模式以外,仓颉也提供了其它各种模式,如常量模式、绑定模式、类型模式等,以及各种模式的嵌套使用。在下面的例子中,我们给出了对应模式的使用:
- 常量模式:可以使用多种字面量值进行判等比较,如整数、字符串等。
- 绑定模式:可以将指定位置的成员绑定到新的变量,多用于解构 enum 或 tuple。上面的sumBinaryTree例子中就用到了绑定模式,将Node节点中实际的参数与三个新声明的变量v、l和r分别绑定。
- 类型模式:可以用于匹配是否目标类型,多用于向下转型。
- tuple 模式:用于比较或者解构 tuple。
- 通配符模式:用于匹配任何值。
未来仓颉还计划引入更加丰富的模式,如序列(sequence)模式、record 模式等。
| // 常量模式-字符串字面量func f1(x: String) { match (x) { case "abc" => () case "def" => () case _ => () // 通配符模式 }}// tuple 模式func f2(x: (Int, Int)) { match (x) { case (_, 0) => 0 // 通配符模式和常量模式 case (i, j) => i / j // 绑定模式,将 x 的元素绑定到 i 和 j 两个变量 }}// 类型模式func f3(x: ParentClass) { match (x) { case y: ChildClass1 => ... case y: ChildClass2 => ... case _ => ... }} |
|---|
我是一名16年开发经验的程序猿,转战鸿蒙,分享我的开发经验,更多知识分享或疑问可:KCKCJY