Sway 单行 match 分支(Single Line Arm):模式匹配、赋值与穷尽性检查实战 📅 发布时间:2026/9/12 16:43:18 👁 浏览次数: Sway 单行 match 分支Single Line Arm模式匹配、赋值与穷尽性检查实战【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway本篇技术指南聚焦 Sway 语言中match表达式的单行分支Single Line Arm写法讲解如何用将匹配模式与返回逻辑分离、将匹配结果直接赋值给变量并深入剖析|析取模式、catch_all兜底分支与按声明顺序逐条检查的语义。读完本文你将能够熟练编写可读性强、覆盖完整且可编译的 Swaymatch表达式并在合约代码中正确运用穷尽性exhaustiveness检查。match在 Sway 控制流中的位置Sway 官方参考文档将match归类在 control-flow 目录 下它与if表达式、循环共同构成语言的控制流体系。正如 match 章节的索引页 所述if表达式适合检查少量条件但存在更优的替代语法——match它允许执行高级模式匹配advanced pattern matching一个match表达式对一个变量进行匹配逐个检查每个分支arm决定执行哪一段逻辑分支按声明顺序从上到下依次检查且最后一个分支必须覆盖所有尚未匹配的模式否则编译器无法处理未指定的模式并会抛出错误即穷尽性检查。单行分支single-line.md是整个match语法的起点它演示了最基本的形式——匹配一个类型并把结果赋值给变量。单行分支的基础语法官方文档给出如下示例该示例来自 docs/reference/src/code/language/control_flow/src/lib.sw 中的simple_match代码段let number 5; let result match number { 0 10, 1 20, 5 50, 6 | 7 60, catch_all 0, };这段代码的核心语义如下箭头两侧职责分明左侧是我们要匹配的模式pattern右侧是匹配成功后要执行的逻辑。在上例中右侧返回的是10的整数倍具体倍数取决于命中的是哪个分支。结果可赋值给变量match在 Sway 中是表达式expression而非语句因此它的求值结果可以直接赋给let result。文档同时强调“赋值给变量是可选的”——也就是说match也可以仅作为控制流使用不捕获返回值。按顺序逐条检查编译器从第一个分支0开始自上而下依次尝试匹配直到某个分支命中或者落入catch_all兜底分支为止。因此分支的书写顺序直接影响执行结果。作为表达式赋值 vs 作为控制流赋值给变量是可选这一点在仓库的实战示例 examples/match_expressions/src/main.sw 中得到了完整印证。该脚本同时展示了match的两种用法// 1. 作为表达式使用匹配结果赋给变量 let is_even match num % 2 { 0 true, _ false, }; // 2. 作为控制流使用只做分支跳转不产生值 let x 12; match x { 5 on_odd(x), _ on_even(x), };第一种用法把match的结果绑定到is_even第二种用法则直接以match语句形式驱动函数调用符合文档中“赋值是可选”的描述。在 lib.sw 的simple_match代码段中变量number被硬编码为5运行时可命中5 50分支result的值为50。|运算符多模式析取文档指出|运算符可以构造一个“多个模式之析取disjunction”的模式。在上面的官方示例中6 | 7 60,含义是当被匹配的值等于6或7时命中该分支并返回60。这避免了为相近的取值重复书写分支使模式表更加紧凑。在 examples/match_expressions/src/main.sw 的枚举匹配示例中|的用法同样直观let is_sunny match current_weather { Weather::Sunny true, Weather::Rainy | Weather::Cloudy | Weather::Snowy false, };这里把Rainy、Cloudy、Snowy三个变体合并到同一个分支统一返回false。可以看到|不仅适用于u64字面量也适用于枚举变体等各类模式是化简“多分支同逻辑”场景的标准手段。catch_all兜底分支文档对catch_all给出了三点关键说明它等价于if表达式中的else。如果if的逐条条件全部不成立会落入else同理如果match的所有模式都没命中就落入catch_all。相关对照可见 if-expressions.md 中对“catch all 情形”的描述。它不是关键字名字可以任意取。catch_all只是一个普通标识符——之所以它能“兜住一切”是因为它作为模式会匹配任何值。在上面的官方示例中如果number不是0、1、5、6、7就会绑定到catch_all这个名字并返回0。一旦编译器看到第一个兜底分支就不再执行后续检查。因此在catch_all之后声明的任何分支都不可能被匹配。这意味着兜底分支必须写在最后否则其后的分支将成为不可达代码逻辑上形成隐藏 bug。从源码结构可以推断编译器对match分支的处理是顺序匹配先到的模式优先一旦命中即短路不再评估剩余模式。这也是 Sway 语义中“分支顺序决定优先级”的根源。穷尽性与编译期保证文档索引页 明确要求最后一个分支必须确保所有模式都被覆盖否则编译器会报错。这是match相比if的重要优势——它在编译期就强制要求你处理所有可能的情况。在枚举匹配中这一点体现得尤为明显。参考 lib.sw 中的枚举匹配示例enum Color { Red: (), Green: (), Blue: (), } fn enum_match(input: Color) { let result match input { Color::Red 0, Color::Green 1, Color::Blue 2, }; }由于Color只有三个变体三个分支恰好构成穷尽覆盖编译器可以确认所有情况都被处理。而在u64这类取值空间无限的类型上就必须借助catch_all或_来兜底例如示例中的catch_all 0。补充说明在 Sway 中通配模式也常用下划线_书写。在 examples/match_expressions/src/main.sw 中可以看到_ true、_ on_even(x)等写法它与命名标识符形式的catch_all语义等价——都是匹配任何未被前面分支捕获的值只是_不绑定名字而已。与多行分支的衔接单行分支是match语法的基础形态当某个分支需要执行多行逻辑时可以把箭头右侧包进花括号{}形成多行分支。这在 multi-line.md 中有专门介绍对应 lib.sw 中的multi_line_match代码段let number 5; let result match number { 0 { // Multiple lines of code here then return 10 10 }, 1 20, 5 50, catch_all 0, };可以看到单行分支与多行分支可以混用0分支使用代码块其余分支保持单行。代码块的最后一个表达式即该分支的返回值。这为“简单场景单行、复杂场景多行”的混合风格提供了语法支持。单行match的进阶扩展掌握单行分支之后Sway 的match还可以覆盖更复杂的模式。仓库参考文档在 complex 子目录 中系统整理了五类高级模式均在 lib.sw 中有对应代码段主题文档位置说明枚举变体complex/enum.md用EnumName::Variant形式匹配枚举结构体字段complex/struct.md用Point { x, .. }部分解构..忽略其余字段常量匹配complex/constant.md只能匹配const常量不能匹配普通变量嵌套表达式complex/nested-expression.md在代码块内嵌套另一个match多值匹配complex/multiple-values.md用元组包裹多个值一起匹配例如常量匹配要求模式必须是编译期常量普通let变量不可用因为其值在编译期不确定而多值匹配则把(self, other)这样的元组整体作为匹配对象。这些模式全部建立在单行分支的、|、catch_all基础语义之上属于同一套语法体系的扩展。小结单行分支使用要点综合官方文档与仓库源码Sway 单行match分支的实践要点可归纳为模式在左、逻辑在右左侧是模式右侧是求值逻辑整个match是表达式可赋值给变量也可仅作控制流。顺序即优先级分支按声明顺序自上而下检查先命中先短路。用|合并等价分支6 | 7、Weather::Rainy | Weather::Cloudy等析取模式可减少重复。兜底分支放最后catch_all或_等价于if的else其后的分支永不可达。保证穷尽覆盖最后一个分支必须覆盖所有未匹配模式否则编译报错——这是match在编译期给智能合约开发者带来的安全保障。对智能合约开发而言match的穷尽性检查尤其有价值枚举状态如订单状态、代币类型、协议阶段的每一种变体都会被强制显式处理有效避免因遗漏分支而在链上产生意外行为。结合 examples/match_expressions/src/main.sw 中的完整脚本以及 docs/reference/src/code/language/control_flow/src/lib.sw 中的全部代码段你可以进一步验证本文介绍的各种写法并上手练习。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考