仓颉原生应用编程语言教程(第4期)

46 阅读2分钟

代数数据类型和模式匹配

代数数据类型是一种复合类型,指由其它数据类型组合而成的类型。两类常见的代数类型是积类型(如 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模式以外,仓颉也提供了其它各种模式,如常量模式、绑定模式、类型模式等,以及各种模式的嵌套使用。在下面的例子中,我们给出了对应模式的使用:

  1. 常量模式:可以使用多种字面量值进行判等比较,如整数、字符串等。
  2. 绑定模式:可以将指定位置的成员绑定到新的变量,多用于解构 enum 或 tuple。上面的sumBinaryTree例子中就用到了绑定模式,将Node节点中实际的参数与三个新声明的变量v、l和r分别绑定。
  3. 类型模式:可以用于匹配是否目标类型,多用于向下转型。
  4. tuple 模式:用于比较或者解构 tuple。
  5. 通配符模式:用于匹配任何值。

未来仓颉还计划引入更加丰富的模式,如序列(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