仓颉编程语言:match 表达式

仓颉语言中的模式匹配与控制流详解【match 表达式、if-let 表达式、while-let 表达式】 在编程语言中,模式匹配是一种强大的工具,用于检查数据结构、提取值、并根据特定条件执行相应的操作。仓颉语言提供了灵活且强大的模式匹配机制,通过match表达式来实现。本文将详细介绍仓颉语言中的match表达式、if-let表达式、while-let表达式以及其他使用模式的场景。 阅读详情

match 表达式的定义

仓颉支持两种 match 表达式,第一种是包含待匹配值的 match 表达式,第二种是不含待匹配值的 match 表达式。

含匹配值的 match 表达式:

main() {
    let x = 0
    match (x) {
        case 1 => let r1 = "x = 1"
                  print(r1)
        case 0 => let r2 = "x = 0" // Matched.
                  print(r2)
        case _ => let r3 = "x != 1 and x != 0"
                  print(r3)
    }
}

match 表达式以关键字 match 开头,后跟要匹配的值(如上例中的 x,x 可以是任意表达式),接着是定义在一对花括号内的若干 case 分支。

每个 case 分支以关键字 case 开头,case 之后是一个模式或多个由 | 连接的相同种类的模式(如上例中的 1、0、_ 都是模式,详见模式概述章节);模式之后可以接一个可选的 pattern guard,表示本条 case 匹配成功后额外需要满足的条件;接着是一个 =>,=> 之后即本条 case 分支匹配成功后需要执行的操作,可以是一系列表达式、变量和函数定义(新定义的变量或函数的作用域从其定义处开始到下一个 case 之前结束),如上例中的变量定义和 print 函数调用。

match 表达式执行时依次将 match 之后的表达式与每个 case 中的模式进行匹配,一旦匹配成功(如果有 pattern guard,也需要 where 之后的表达式的值为 true;如果 case 中有多个由 | 连接的模式,只要待匹配值和其中一个模式匹配则认为匹配成功)则执行 => 之后的代码然后退出 match 表达式的执行(意味着不会再去匹配它之后的 case),如果匹配不成功则继续与它之后的 case 中的模式进行匹配,直到匹配成功(match 表达式可以保证一定存在匹配的 case 分支)。

上例中,因为 x 的值等于 0,所以会和第二条 case 分支匹配(此处使用的是常量模式,匹配的是值是否相等,详见常量模式章节),最后输出 x = 0。

编译并执行上述代码,输出结果为:

x = 0

match 表达式要求所有匹配必须是穷尽(exhaustive)的,意味着待匹配表达式的所有可能取值都应该被考虑到。当 match 表达式非穷尽,或者编译器判断不出是否穷尽时,均会编译报错,换言之,所有 case 分支(包含 pattern guard)所覆盖的取值范围的并集,应该包含待匹配表达式的所有可能取值。常用的确保 match 表达式穷尽的方式是在最后一个 case 分支中使用通配符模式 _,因为 _ 可以匹配任何值。

match 表达式的穷尽性保证了一定存在和待匹配值相匹配的 case 分支。下面的例子将编译报错,因为所有的 case 并没有覆盖 x 的所有可能取值:

func nonExhaustive(x: Int64) {
    match (x) {
        case 0 => print("x = 0")
        case 1 => print("x = 1")
        case 2 => print("x = 2")
    }
}

在 case 分支的模式之后,可以使用 pattern guard 进一步对匹配出来的结果进行判断。pattern guard 使用 where cond 表示,要求表达式 cond 的类型为 Bool。

在下面的例子中(使用到了 enum 模式,详见 enum 模式章节),当 RGBColor 的构造器的参数值大于等于 0 时,输出它们的值,当参数值小于 0 时,认为它们的值等于 0:

enum RGBColor {
    | Red(Int16) | Green(Int16) | Blue(Int16)
}
main() {
    let c = RGBColor.Green(-100)
    let cs = match (c) {
        case Red(r) where r < 0 => "Red = 0"
        case Red(r) => "Red = ${r}"
        case Green(g) where g < 0 => "Green = 0" // Matched.
        case Green(g) => "Green = ${g}"
        case Blue(b) where b < 0 => "Blue = 0"
        case Blue(b) => "Blue = ${b}"
    }
    print(cs)
}

编译执行上述代码,输出结果为:

Green = 0

没有匹配值的 match 表达式:

main() {
    let x = -1
    match {
        case x > 0 => print("x > 0")
        case x < 0 => print("x < 0") // Matched.
        case _ => print("x = 0")
    }
}

与包含待匹配值的 match 表达式相比,关键字 match 之后并没有待匹配的表达式,并且 case 之后不再是 pattern,而是类型为 Bool 的表达式(上述代码中的 x > 0 和 x < 0)或者 _(表示 true),当然,case 中也不再有 pattern guard。

无匹配值的 match 表达式执行时依次判断 case 之后的表达式的值,直到遇到值为 true 的 case 分支;一旦某个 case 之后的表达式值等于 true,则执行此 case 中 => 之后的代码,然后退出 match 表达式的执行(意味着不会再去判断该 case 之后的其他 case)。

上例中,因为 x 的值等于 -1,所以第二条 case 分支中的表达式(即 x < 0)的值等于 true,执行 print("x < 0")。

编译并执行上述代码,输出结果为:

x < 0

match 表达式的类型

对于 match 表达式(无论是否有匹配值),

  • 在上下文有明确的类型要求时,要求每个 case 分支中 => 之后的代码块的类型是上下文所要求的类型的子类型;

  • 在上下文没有明确的类型要求时,match 表达式的类型是每个 case 分支中 => 之后的代码块的类型的最小公共父类型;

  • 当 match 表达式的值没有被使用时,其类型为 Unit,不要求各分支的类型有最小公共父类型。

下面分别举例说明。

let x = 2
let s: String = match (x) {
    case 0 => "x = 0"
    case 1 => "x = 1"
    case _ => "x != 0 and x != 1" // Matched.
}

上面的例子中,定义变量 s 时,显式地标注了其类型为 String,属于上下文类型信息明确的情况,因此要求每个 case 的 => 之后的代码块的类型均是 String 的子类型,显然上例中 => 之后的字符串类型的字面量均满足要求。

再来看一个没有上下文类型信息的例子:

let x = 2
let s = match (x) {
    case 0 => "x = 0"
    case 1 => "x = 1"
    case _ => "x != 0 and x != 1" // Matched.
}

上例中,定义变量 s 时,未显式标注其类型,因为每个 case 的 => 之后的代码块的类型均是 String,所以 match 表达式的类型是 String,进而可确定 s 的类型也是 String。

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing ,不定期分享原创知识。

【Bug已解决】openclaw max turns reached / Tool calls exceeded limit — OpenClaw 最大轮次超限解决方案 OpenClaw 在执行过程中达到最大轮次限制任务未完成,本质是 --max-turns 设置过小或任务过于复杂。文中给出增加轮次、--continue 继续、分步执行等完整方案。 阅读详情

相关推荐

生信分析服务MR孟德尔随机化单细胞测序转录组数据分析网络药理学

通过上述技术整合,可实现从基因-环境-疾病关联到药物机制解析的全链条研究,为疾病机制解析和药物研发提供新思路。结合,是当前生物信息学领域的前沿方法,尤其在疾病机制解析、靶点发现和药物研发中展现出巨大潜力。

matlabgoodboy的博客 1522

仓颉编程语言 -- 初识(一)

仓颉编程语言 -- 初识(一)

chinusyan的专栏 3027

光学设计进阶:Zemax中的坐标断点与离轴系统优化

本文深入解析了Zemax中坐标断点的核心原理与实战应用,它是实现离轴光学系统设计的关键。文章通过比喻和实例,详细阐述了如何利用坐标断点作为“方向盘”来精确控制光学元件的偏心和倾斜,实现“前断后接”的局部坐标系变换,从而构建并优化无中心遮拦的离轴反射系统,避免光线失控。

3a9bq4r8t2y的博客 528

仓颉编程(14)match表达式

在包含匹配值的 match 表达式中使用常量模式时,要求常量模式表示的值的类型与待匹配值的类型相同,匹配成功的条件是待匹配的值与常量模式表示的值相等。enum 模式用于匹配 enum 类型的实例,它的定义和 enum 的构造器类似:无参构造器C或有参构造器C(p_1, p_2, ..., p_n),构造器的类型前缀可以省略,区别在于这里的p_1到p_n(n 大于等于 1)是模式。一旦某个 case 分支匹配成功并执行相应的代码块后,会立即退出 match 表达式,不会执行后续的 case 分支。

sucker的博客 1297

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1123

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 285

鸿蒙仓颉语言【匹配match】

match特性是现代编程语言中常见的特性,它们在不同的编程语言中有类似的概念和语法,但在细节上可能有一些差异。它们都可以提高代码的灵活性和可重用性,但用法和语法可能会因编程语言而异。

鸿蒙的技术博客 493

水文模型大合集---SWAT模型、VIC模型、HEC-HMS模型、HSPF模型、FVCOM模型、Delft3D模型、HYPE模型.......

1.1 面源污染概要1.2 SWAT模型及应用1.3 SWAT模型原理1.4 SWAT模型输入文件1.5 ArcGIS与SWAT关系。

jwwkyjspt的博客 4363

3.仓颉编程_没有switch_case需使用match_case

仓颉支持两种 match 表达式,第一种是包含待匹配值的 match 表达式,第二种是不含待匹配值的 match 表达式。含匹配值的 match 表达式main()'//不可变量var b = 77 //可变变量match(b){case _ => a2= '' //缺少此句会报错match 表达式要求所有匹配必须是穷尽(exhaustive)的,意味着待匹配表达式的所有可能取值都应该被考虑到。

Txwtech 455

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

码农研究僧的博客 1万+

【AgentScope 2.0】01-不搭 demo,直接解剖一个生产级 Agent 平台:loser-agent 全链路地图

本文介绍生产级Agent平台loser-agent的完整请求旅程,从用户发消息到返回结果共七站:入口鉴权、灰度路由、Agent装配、模型路由、工具执行、持久化与流式响应。课程以真实源码为线索,深入剖析每一步实现逻辑,涵盖灰度发布、权限控制、HITL审批、多模态处理、状态持久化等核心能力。强调框架仅负责Agent运行时语义,平台自建管理请求生命周期中所有非框架部分,适合Java后端开发者系统掌握Agent工程化落地。

loser.with.m的博客 726

跟我一起学“仓颉”编程语言-模式练习题

本章为大家详细的介绍了仓颉编程语言中模式练习题的内容。

Cool_foolisher的博客 817

YOLOv改进 | YOLOv11添加WTConv小波卷积,能够更有效地捕捉局部和全局特征

在计算机视觉目标检测领域,YOLO(You Only Look Once)系列算法凭借“单阶段检测”的高效性(一次前向传播同时完成目标定位与分类),已成为工业界与学术界的主流选择。从YOLOv1到YOLOv11,算法持续迭代优化,在速度与精度之间寻求平衡,广泛应用于自动驾驶、智能安防、工业质检等场景。为解决上述问题,本文提出一种基于,将输入特征图分解为不同频率的子带(低频全局信息与高频局部细节),并分别通过卷积操作提取局部与全局特征,最后融合多尺度特征,从而更有效地捕捉目标的局部细节与全局结构。

走向CTO的路上... 1252

深入仓颉(Cangjie)编程语言:if/else——从“流程控制”到“安全表达式”的进化

if。

2403_88996352的博客 931

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

仓颉编程(4)流程控制语句

在仓颉编程语言中,分支结构(也称为条件结构或选择结构)是通过检查一系列条件,当条件满足或不满足时执行特定程序逻辑的控制结构。这些条件通过逻辑运算或关系运算完成判断,是实现程序逻辑分支的重要手段。条件类型严格要求:仓颉是强类型的编程语言,所有分支结构的条件必须是布尔类型,不允许使用整数或浮点数等类型进行隐式转换。这与 C 语言等传统语言存在显著差异,仓颉不以条件取值是否为 0 作为分支选择依据。表达式特性。

sucker的博客 774

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

仓颉之枚举类型与模式匹配的冒险之旅

仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE工具链支持,为开发者打造友好开发体验和卓越程序性能。案例结合代码体验,让大家更直观的了解仓颉语言中的枚举类型与模式匹配。对于包含匹配值的 match 表达式,case 之后支持哪些模式决定了 match 表达式的表达能力,本节中将依次介绍仓颉支持的模式,包括:常量模式、通配符模式、绑定模式、tuple 模式、类型模式和 enum 模式。

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1115

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

仓颉(Cangjie) Option类型实战:从match表达式到?操作符,四种取值方法到底怎么选?

本文深入探讨了仓颉(Cangjie)编程语言中Option类型的四种取值方法:match表达式、getOrThrow、??操作符和?.安全调用操作符。通过对比分析各方法的适用场景、性能表现和代码风格,帮助开发者在不同业务需求下做出最优选择,提升代码的健壮性和可读性。

weixin_30955617的博客 441

仓颉编程语言的match表达式

摘要:仓颉编程语言支持两种match表达式实现模式匹配,带值匹配模式和不带值的布尔条件分支。相比传统if-else,match能更简洁高效地处理多分支逻辑,尤其适合枚举、元组等复杂数据结构。支持多种匹配模式:常量模式、通配符(_)、绑定模式、元组模式、类型模式及模式守卫(where)。匹配按顺序执行,命中即停,未处理分支需用_兜底确保穷尽。示例展示了数字分类、类型转换、枚举处理等场景,体现match在简化代码、提升可读性方面的优势。

cnds123的专栏 1010

仓颉编程语言青少年基础教程:表达式

传统编程语言中,表达式通常指 “操作数、操作符” 的组成(如1+2);而在仓颉中,凡是可求值的语言元素都是表达式。仓颉语言的表达式有一个明显的特点,范围不再局限于传统算术运算,而是扩展到条件表达式、循环表达式等多种类型。仓颉语言的表达式包括:常规表达式、赋值表达式、流程控制表达式、异常处理try 表达式。

cnds123的专栏 1351

仓颉编程语言中的模式匹配与match表达式详解

模式匹配是仓颉语言中一种强大的控制流结构,它允许开发者根据数据的形状或内容来分支代码执行路径。与传统基于值的条件分支(如if-else)不同,模式匹配能够同时检查数据的类型和结构。模式匹配提供结构化数据解构能力支持多种模式类型与枚举完美配合使代码更简洁安全区分可反驳与不可反驳模式保证模式匹配的严谨性指导正确的模式使用场景match表达式替代复杂的条件逻辑支持守卫条件和嵌套模式编译器保证穷尽性检查性能经过优化优先使用模式匹配处理复杂条件合理利用编译器检查保证完整性。

Huang兄 1236

解锁仓颉编程语言的奥秘:枚举类型、模式匹配与类接口全解析

Red,Green,Blue,// 输出: Green模式是仓颉语言中用于结构化解构和匹配的数据描述方式。字面量模式枚举模式结构模式通配符模式仓颉语言中的类支持面向对象的建模,包含属性和方法。// 输出: Hello, my name is Alicec.draw();本文深入剖析了仓颉编程语言的基础数据类型及其高级用法,并通过代码示例展示了每种类型的实际应用场景。

2301_80863610的博客 1923

跟我一起学“仓颉”编程语言-match表达式

本章为大家详细的介绍了仓颉编程语言中match表达式的内容。

Cool_foolisher的博客 834

仓颉语言 -- 枚举类型和模式匹配

仓颉语言 -- 枚举类型和模式匹配

chinusyan的专栏 2020

跟我一起学“仓颉”编程语言-try表达式

本章为大家详细的介绍了仓颉编程语言中try表达式的内容。

Cool_foolisher的博客 645
上一篇: 仓颉编程语言:模式的 Refutability
下一篇: 仓颉编程语言:if-let 表达式
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值