新闻详情

新闻详情

首页 / 资讯中心 / 详情

Sway 智能合约中枚举的模式匹配:从变体匹配到嵌套与元组组合

发布时间:2026/9/12 12:51:07来源:尧图网络
Sway 智能合约中枚举的模式匹配:从变体匹配到嵌套与元组组合
Sway 智能合约中枚举的模式匹配从变体匹配到嵌套与元组组合【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway本篇技术指南聚焦 Fuel 生态 Sway 语言在match表达式中对枚举enum也称 sum type进行模式匹配的完整语法与实战用法。无论你是在编写合约状态机、错误处理分支还是协议层数据结构掌握按枚举名与变体匹配是写出可读、可穷尽、可编译智能合约的关键。读完本文你将掌握枚举变体匹配的基础语法、单行/多行 arm 的写法、嵌套枚举与元组多值匹配的组合技巧并理解 Sway 编译器对 match 穷尽性检查的约束。枚举模式匹配的核心语法在 Sway 中一个枚举可以通过指定枚举名与变体名来被match匹配。这是 match 复杂模式 系列中第一个要掌握的形态对应文档 Enums。下面是在仓库代码 lib.sw 中定义的complex_enum_match锚点示例enum Color { Red: (), Green: (), Blue: (), } fn enum_match(input: Color) { let result match input { Color::Red 0, Color::Green 1, Color::Blue 2, }; }其要点非常直接匹配左侧是模式Color::Red同时给出枚举类型名Color与具体变体Red二者缺一不可匹配右侧是分支逻辑箭头右边是命中该 arm 后要执行/返回的表达式变体顺序即匹配顺序编译器按声明顺序自上而下逐 arm 检查因此 arm 的排列顺序会影响匹配结果穷尽性由编译器保证本示例中Color的 3 个变体全部被覆盖因此不需要兜底 arm如果遗漏任何一个变体编译器会因无法处理未指定的模式而报错。枚举定义回顾sum type 与 unit type要匹配枚举先要理解枚举本身。Sway 语言文档 Enums 指出枚举是一种sum type由若干个命名且带类型的变体组成。在上述Color示例中所有变体的类型都是单元类型()即不含任何数据的类型。但这只是一个简化任何类型都可以作为变体的载荷类型——包括原生标量、结构体、数组甚至其他枚举。枚举的变体在{}内自上而下顺序排列每个变体写成Name: Type的形式。例如enum SecondLevel { Value1: u64, Value2: () }中Value1携带一个u64数据而Value2不携带数据。变体是否携带数据直接决定了匹配时能否绑定变量见下文嵌套枚举一节。match 表达式的通用规则枚举匹配只是match的用途之一。根据 match 总览文档match表达式对某个变量进行匹配逐个检查每个 case称为arm决定执行哪一条分支逻辑arm 按声明顺序自上而下依次检查最后一个 arm 必须保证覆盖所有可能模式穷尽性否则编译器会报错因为它无法处理未指定的模式。Sway 的 match 单行 arm 文档 还补充了三条常用规则|析取操作符可以用6 | 7 60的形式把多个模式合并成一个 armcatch_all兜底 arm等价于if表达式中的else它不需要固定命名为catch_all任意标识符皆可兜底 arm 之后的 arm 永不生效编译器一旦看到第一个兜底模式就会停止后续检查因此兜底 arm 必须放在最后。在多行场景下可以用花括号{}包裹箭头右侧从而在一个 arm 内书写多行逻辑见 Multi Line Arm。嵌套枚举枚举套枚举时的分层匹配当枚举变体的载荷类型本身又是枚举时就需要嵌套的match表达式。仓库文档 Nested Expressions 与 lib.sw 中的nested_enum_match给出了完整示范enum TopLevel { One: (), Two: SecondLevel, } enum SecondLevel { Value1: u64, Value2: (), } fn nested_match(input: TopLevel) - u64 { match input { TopLevel::One 1, TopLevel::Two(second) { match second { SecondLevel::Value1(2) 2, SecondLevel::Value1(_) 3, SecondLevel::Value2 42, } }, } }这段代码揭示了三个进阶要点载荷绑定TopLevel::Two(second)将Two变体携带的SecondLevel数据绑定到变量second随后在 arm 内的代码块中开启第二个match内层字面量匹配SecondLevel::Value1(2)直接匹配载荷为字面量2的情况这是模式匹配对枚举载荷的深入利用通配符_SecondLevel::Value1(_)匹配Value1携带任意数据的情况_表示忽略该位置的载荷值。由于Value1(2)已经先行匹配了2剩余的Value1载荷统一落入_arm返回3。多值匹配用元组组合多个枚举变体当需要同时匹配两个及以上枚举时可以把它们包装进元组再按元组结构逐位置指定模式。仓库文档 Multiple Values 与 lib.sw 中的complex_multi_arg_enum_match展示了如何在自定义PartialEq实现中运用这一技巧enum Binary { True: (), False: (), } impl PartialEq for Binary { fn eq(self, other: Self) - bool { match (self, other) { (Binary::True, Binary::True) true, (Binary::False, Binary::False) true, _ false, } } }这里的模式(Binary::True, Binary::True)是一个二元组模式要求self与other同时为True才返回true同理(Binary::False, Binary::False)。其余所有组合一真一假、一假一真由兜底模式_捕获并返回false。这种元组 枚举模式 兜底的组合是 Sway 中实现多值联合判断的惯用法。与其他复杂模式的协同枚举匹配在match复杂模式体系中并非孤立存在它常与以下模式配合使用见 Complex Patterns 总览结构体模式Structs用Point { x: 5, y }匹配结构体特定字段用..忽略其余字段若结构体来自其他模块且含私有字段私有字段必须始终用..忽略常量模式Constantsmatch中可以直接匹配常量变量如const NUMBER_1: u64 7;普通变量不能作为匹配模式if let简化对于只关心枚举的某一个变体的场景可以用if let Foo::One one { ... }代替完整的match见 lib.sw 中的if_let_example1/if_let_example2。在仓库中定位与验证本文涉及的所有示例均来自同一份可编译的 Sway 源文件便于对照验证代码锚点源文件docs/reference/src/code/language/control_flow/src/lib.sw其中complex_enum_match位于 L191-L205nested_enum_match位于 L128-L151complex_multi_arg_enum_match位于 L153-L168文档目录docs/reference/src/documentation/language/control-flow/match/ 及其 complex 子目录覆盖单行/多行 arm、枚举、结构体、常量、嵌套表达式、多值匹配全部主题枚举定义与初始化参考枚举语言文档 以及仓库中的完整示例工程 examples/enums内含basic_enum.sw、enum_of_structs.sw、enum_of_enums.sw等多个可直接运行的枚举用例。小结Sway 的枚举模式匹配以枚举名 变体名为基本形式配合 arm 顺序检查、编译器穷尽性约束、|析取、catch_all兜底与_通配符可以表达从最简单的三色枚举分支到枚举嵌套枚举、元组联合匹配等复杂逻辑。理解这些语法组合是编写结构清晰、模式安全且可维护的 Sway 智能合约的基础功。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Buzz 的 Agent 活动流(Activity Feed)设计:以「动词-对象-结果」为骨架构建可监督、可信任的代理协作界面 2026/9/12 13:24:12

Buzz 的 Agent 活动流(Activity Feed)设计:以「动词-对象-结果」为骨架构建可监督、可信任的代理协作界面

Buzz 的 Agent 活动流(Activity Feed)设计:以「动词-对象-结果」为骨架构建可监督、可信任的代理协作界面 【免费下载链接】buzz A hive mind communication platform 项目地址: https://gitcode.com/GitHub_Trending/buzz14/buzz 导读…

阅读更多 →
Vant 4 Skeleton 骨架屏组件完全指南:从占位占位到加载完成的实战用法与源码原理 2026/9/12 13:24:12

Vant 4 Skeleton 骨架屏组件完全指南:从占位占位到加载完成的实战用法与源码原理

Vant 4 Skeleton 骨架屏组件完全指南:从占位占位到加载完成的实战用法与源码原理 【免费下载链接】vant A lightweight, customizable Vue UI library for mobile web apps. 项目地址: https://gitcode.com/GitHub_Trending/va/vant Skeleton(骨架…

阅读更多 →
Ruff Playground 在线体验平台全解析:架构设计、WASM 集成与本地部署指南 2026/9/12 13:24:12

Ruff Playground 在线体验平台全解析:架构设计、WASM 集成与本地部署指南

Ruff Playground 在线体验平台全解析:架构设计、WASM 集成与本地部署指南 【免费下载链接】ruff An extremely fast Python linter and code formatter, written in Rust. 项目地址: https://gitcode.com/GitHub_Trending/ru/ruff Ruff Playground 是 Astral…

阅读更多 →
go2rtc 低延迟摄像头流媒体:从安装到接入第一路流的 4 步完整指南 2026/9/12 13:24:12

go2rtc 低延迟摄像头流媒体:从安装到接入第一路流的 4 步完整指南

go2rtc 低延迟摄像头流媒体:从安装到接入第一路流的 4 步完整指南 【免费下载链接】go2rtc Ultimate camera streaming application 项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc go2rtc 是一个零依赖的摄像头流媒体应用,能把 RTSP、…

阅读更多 →
TDengine 零代码数据接入:通过 taosExplorer 将 Oracle 数据迁移至 TDengine 的完整指南 2026/9/12 13:24:12

TDengine 零代码数据接入:通过 taosExplorer 将 Oracle 数据迁移至 TDengine 的完整指南

TDengine 零代码数据接入:通过 taosExplorer 将 Oracle 数据迁移至 TDengine 的完整指南 【免费下载链接】TDengine High-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios 项目地址: https://gitcode.com/GitHub_Trend…

阅读更多 →
护网行动零基础入门指南:一个月搞定蓝队值守岗 2026/9/12 13:21:12

护网行动零基础入门指南:一个月搞定蓝队值守岗

每年到了护网季前后,社群里总有一批在校大学生刷屏:护网行动零基础能上吗?培训班动辄好几千,值不值?简历上这半年一段项目经历都没写,进去会不会直接劝退? 我的答案比较直接:护网行…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞