news 2026/9/12 16:03:07

Sway 智能合约 FizzBuzz 实战:用枚举状态与模运算实现经典编程游戏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Sway 智能合约 FizzBuzz 实战:用枚举状态与模运算实现经典编程游戏

Sway 智能合约 FizzBuzz 实战:用枚举状态与模运算实现经典编程游戏

【免费下载链接】sway🌴 Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway

这篇技术指南围绕 Sway 语言官方仓库中的 FizzBuzz 示例展开,完整讲解如何在 Sway 中通过enum定义游戏状态、用模运算符(%)实现整除判断,并将逻辑同时封装为可复用的库函数与对外暴露 ABI 的智能合约。读完本文,你将掌握 Sway 枚举变体的声明与匹配、单元类型()的用法、合约 ABI 的编写方式,以及如何用forc构建和运行一个完整的 FizzBuzz 合约。

FizzBuzz 游戏规则

FizzBuzz 是一个经典的编程入门游戏:给定一个数字,根据其整除性返回不同的结果。本文示例定义的规则如下:

  • 能被3整除的数字返回Fizz
  • 能被5整除的数字返回Buzz
  • 能被35同时整除的数字返回Fizzbuzz
  • 其他任何数字原样返回给用户

需要特别注意的是第三条规则:同时能被35整除意味着能被15整除。这决定了实现中检查条件的先后顺序,是整段逻辑正确性的关键。

用枚举定义游戏状态

游戏的可能结果天然适合用 Sway 枚举(enum) 来表达。在官方文档配套的库代码 lib.sw 中,状态枚举定义如下:

enum State { Fizz: (), Buzz: (), FizzBuzz: (), Other: u64, }

结合 Sway 枚举语法文档 可以看到,Sway 枚举由enum关键字、枚举名和花括号内的若干**变体(variant)**组成,每个变体的形式为名称: 类型

  • FizzBuzzFizzBuzz三个变体的类型是单元类型(),即不携带任何数据的空类型,仅作为标记使用;
  • Other变体的类型是u64,用于携带无法被35整除的原始输入值——这正是“其他数字原样返回”规则的数据载体。

值得留意的是,同一个枚举中不同变体可以携带不同类型的载荷,这是 Sway 枚举作为“和类型(sum type)”的核心能力,也是后续matchif分支解构的基础。

核心实现:模运算与整除判断

FizzBuzz 的判断逻辑同样位于 lib.sw 中,是一个接收u64输入、返回State枚举的普通 Sway 函数:

fn fizzbuzz(input: u64) -> State { if input % 15 == 0 { State::FizzBuzz } else if input % 3 == 0 { State::Fizz } else if input % 5 == 0 { State::Buzz } else { State::Other(input) } }

实现要点:

  1. 模运算符%input % 15计算输入除以 15 的余数,余数为 0 即表示整除。Sway 内置的%运算符在这里直接承担了全部整除判断。
  2. 判断顺序的取舍:第一个分支先检查input % 15 == 0,因为能被 15 整除的数字同时满足“被 3 整除”和“被 5 整除”两个条件。若先检查% 3% 5,则这类数字会在更早的分支被返回,永远不会进入FizzBuzz分支。先取交集(15)再取并集(3、5)的顺序保证了三种结果互不抢占。
  3. 枚举构造:分支体直接写出State::FizzBuzzState::FizzState::Buzz,对应三个单元类型变体;最后一个分支通过State::Other(input)把原始输入封装进Other变体,实现“其他数字原样返回”。

从库函数到智能合约:ABI 封装

上面展示的lib.swlibrary;声明,是可被其他模块引用的纯逻辑库。而在仓库的 examples/fizzbuzz 目录下,还有一个可直接部署的合约版本 main.sw,它把同样的逻辑包装成对外可调用的 ABI 方法:

contract; enum FizzBuzzResult { Fizz: (), Buzz: (), FizzBuzz: (), Other: u64, } abi FizzBuzz { fn fizzbuzz(input: u64) -> FizzBuzzResult; } impl FizzBuzz for Contract { fn fizzbuzz(input: u64) -> FizzBuzzResult { if input % 15 == 0 { FizzBuzzResult::FizzBuzz } else if input % 3 == 0 { FizzBuzzResult::Fizz } else if input % 5 == 0 { FizzBuzzResult::Buzz } else { FizzBuzzResult::Other(input) } } }

这个版本与文档正文的区别在于:

  • 文件以contract;开头,声明这是一个智能合约;
  • 状态枚举更名为FizzBuzzResult,语义上更贴合“方法返回值”的角色;
  • 通过abi FizzBuzz { ... }定义对外接口,再用impl FizzBuzz for Contract提供实现,input参数与返回值类型FizzBuzzResult都写在 ABI 签名中。

正如 docs/book 中的 FizzBuzz 说明 所强调的,这里的 FizzBuzz 并不是传统意义上的命令行程序,而是智能合约版本:外部脚本(Script)或其他合约可以调用fizzbuzzABI 方法,传入某个u64值,并收到一个枚举类型的返回值。由于FizzBuzzResult是自定义枚举类型,编译器会自动将其格式写入生成的 ABI JSON 中,链下代码据此即可正确编码、解码往返数据——这是 Sway 合约与链下客户端互操作的关键机制。

项目配置与构建运行

合约版本的项目配置位于 examples/fizzbuzz/Forc.toml:

[project] authors = ["Fuel Labs <contact@fuel.sh>"] entry = "main.sw" license = "Apache-2.0" name = "fizzbuzz" [dependencies] std = { path = "../../sway-lib-std" }

配置说明:

  • name:项目名为fizzbuzz
  • entry:入口文件为src/main.sw
  • license:采用 Apache-2.0;
  • [dependencies]:以路径方式依赖仓库内的标准库 sway-lib-std,这也是%u64等基础类型与运算的提供来源。

在 examples/fizzbuzz 目录下,可以使用forc命令链构建并检查该合约:

forc build # 编译合约,输出字节码与 ABI JSON forc check # 仅做类型检查与语义分析,不生成字节码

forc build成功后会在out/目录生成合约字节码以及包含fizzbuzz方法与FizzBuzzResult类型定义的 ABI JSON 文件;脚本端只需依据该 ABI 即可发起跨合约调用并解析返回值。

源码参考路径汇总

  • 文档正文对应实现:docs/reference/src/code/examples/fizzbuzz/src/lib.sw(库函数版,含文档锚点注释)
  • 可部署合约版本:examples/fizzbuzz/src/main.sw
  • 项目清单文件:examples/fizzbuzz/Forc.toml
  • 合约版 FizzBuzz 的补充说明:docs/book/src/examples/fizzbuzz.md
  • Sway 枚举语法:docs/reference/src/documentation/language/built-ins/enums.md
  • Sway 函数语法:docs/reference/src/documentation/language/functions/index.md

FizzBuzz 虽然逻辑简单,却是检验一门语言枚举类型、分支控制与整除运算的绝佳样例。在 Sway 中,它进一步展示了同一段逻辑如何从“库函数”平滑升级为“合约 ABI 方法”,以及自定义枚举类型如何通过 ABI JSON 与链下世界无缝衔接,是理解 Sway 合约开发基础范式的高质量入门示例。

【免费下载链接】sway🌴 Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 16:01:10

Koodo Reader 实战指南:6 个平台、18 种电子书格式的阅读与同步

Koodo Reader 实战指南&#xff1a;6 个平台、18 种电子书格式的阅读与同步 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Tre…

作者头像 李华
网站建设 2026/9/12 16:00:55

Java微服务零售中台实战:Spring Boot 2.7.x轻量级架构解析

简介&#xff1a;本资源是一套完整的Java毕业设计项目实战材料&#xff0c;面向计算机专业本科生及Spring Boot初学者&#xff0c;聚焦无人超市场景下的全栈开发实践。项目基于Spring Boot构建&#xff0c;涵盖商品管理、自助购物、支付结算、库存预警、会员积分、安防监控与销…

作者头像 李华
网站建设 2026/9/12 16:00:01

NLP技术演进:从基础概念到Transformer实战应用

1. NLP概述&#xff1a;从基础概念到技术演进自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;作为人工智能领域最具挑战性的分支之一&#xff0c;其核心目标是让计算机能够理解、解释和生成人类语言。我第一次接触NLP是在2016年处理客服工单分类项目时&…

作者头像 李华