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

代数数据类型和模式匹配

代数数据类型是一种复合类型,指由其它数据类型组合而成的类型。两类常见的代数类型是积类型(如 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

posted @ 2024-11-08 10:04  IT猿人  阅读(75)  评论(0)    收藏  举报