news 2026/9/12 15:35:01

Sway Boolean 类型(bool)完全指南:true/false 语义、取反运算符与标准库实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Sway Boolean 类型(bool)完全指南:true/false 语义、取反运算符与标准库实践

Sway Boolean 类型(bool)完全指南:true/false 语义、取反运算符与标准库实践

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

Sway 是一门为 FuelVM 设计的静态类型智能合约语言,其内建(built-in)原始类型bool用于表示"真/假"二元状态,是条件逻辑、权限校验与结果验证的基石。本文基于 Sway 语言参考文档(docs/reference/src/documentation/language/built-ins/boolean.md),结合仓库内标准库源码与官方代码示例,系统讲解 Sway 中布尔值的定义、运算、取反语义及其底层实现,帮助你写出严谨、可验证的合约条件逻辑。

什么是 Boolean 类型

在 Sway 中,Boolean(布尔)是一种只有两种可能取值的类型:true(真)或false(假)。从底层表示看,布尔值由数值10表达,语言为其提供了truefalse两个具名值,使代码可读性更高。

Sway 是一门静态类型语言,所有值的类型在编译期必须已知(详见 Built-in Types 概览)。bool是 Sway 提供的原始(primitive)类型之一,与u8/u16/u32/u64/u256str/str[n]b256等类型并列,其他复合类型(数组、元组、结构体、枚举)均由这些原始类型构造而来。

从语法解析层面看,truefalse属于字面量(literal)的一种:sway-ast中的Literal::Bool携带LitBool节点(sway-ast/src/literal.rs),其中LitBoolType明确区分TrueFalse两种枚举变体,并可无缝转换为 Rust 的boolLitBoolType::True => trueLitBoolType::False => false),这印证了 Sway 布尔字面量与底层二值语义的一一对应关系。

声明布尔变量

声明布尔变量与声明其他类型的变量并无二致,通过let关键字绑定,编译器通常能自动推断类型:

let is_true = true; // 推断为 bool let is_false = false; // 推断为 bool

也可以显式标注类型:

let is_enabled: bool = true;

官方文档中给出的完整示例位于 docs/reference/src/code/language/built-ins/booleans/src/lib.sw(该示例以library;声明为一个库项目,其清单文件 Forc.toml 中entry = "lib.sw",并依赖标准库std):

library; fn returns_true() -> bool { let is_true = true; let is_false = false; // implicitly returns the Boolean value of `true` is_true == !is_false }

该函数依次声明了一个true与一个false布尔变量,对is_false施加取反运算符!得到true,再与is_true做相等比较==,最终隐式返回比较结果(Sway 中函数最后一个表达式的值即返回值,无需显式return,参见 函数返回值)。由于true == true成立,该函数总是返回true

布尔表达式与条件逻辑

布尔值最常见的用途是条件判断与验证。Sway 中ifelse ifelse表达式的分支条件必须求值为bool(参见 if 表达式):

let number = 5u64; if number % 3 == 0 { // 条件为 true 时执行 } else if number % 4 == 0 { // 上一条件为 false、本条件为 true 时执行 } else { // 以上所有条件均为 false 时的兜底分支 }

条件按定义顺序依次求值:一旦某个条件为true,即进入对应分支并跳过其余条件;所有条件均为false时进入else兜底分支。此外,if在 Sway 中是表达式,可以与let组合(if let形式),例如对枚举变体进行模式匹配——无论哪种用法,其判断结果都是true/false布尔值。

if之外,比较运算符(==!=<>等)的求值结果同样是bool。在标准库中,相等比较由PartialEqtrait 提供:impl PartialEq for bool通过__eq(self, other)内建指令实现,并配套impl Eq for bool {}(sway-lib-std/src/ops.sw);而!=则由默认方法neq定义为(self.eq(other)).not(),即对相等结果取反(sway-lib-std/src/ops.sw)。

一元取反运算符!

Sway 提供一元(unary)取反运算符!,用于翻转布尔值:

  • truefalse
  • falsetrue

这一运算符由标准库中的Nottrait 支撑。Not定义方法fn not(self) -> Self,其文档示例甚至用自定义结构体展示!可被重载到用户类型上(sway-lib-std/src/ops.sw)。对bool的内建实现如下(sway-lib-std/src/ops.sw):

impl Not for bool { fn not(self) -> Self { __eq(self, false) } }

值得注意的是,bool的取反并非单纯的位翻转,而是通过内建指令__eqfalse比较得出:若selftruetrue == falsefalse;若selffalsefalse == falsetrue,从而精确完成语义取反。这也解释了为什么示例中!is_false求值为true

Nottrait 同时为u8/u16/u32/u64/u256/b256等类型实现了按位取反(__not),但布尔取反与整数按位取反语义不同,使用时注意区分。

标准库中的布尔实践

标准库(sway-lib-std/src)大量以bool作为返回值或参数,是学习布尔用法的绝佳参考:

  • 断言assert(condition: bool)接收一个布尔条件,条件为false时回滚交易(sway-lib-std/src/assert.sw),是合约验证的核心工具:
    assert(returns_true());
  • 调用方身份校验auth模块的caller_is_external() -> bool返回当前调用是否为外部调用(sway-lib-std/src/auth.sw),常配合require/assert实现访问控制。
  • 零值判断Address::is_zero(self) -> boolAssetId::is_zero(self) -> bool等谓词方法用于校验地址/资产 ID 是否为零值(见 sway-lib-std/src/address.sw 与 sway-lib-std/src/asset_id.sw)。
  • 容器状态查询Bytes::is_empty(self) -> bool判断字节数组是否为空(sway-lib-std/src/bytes.sw)。

这类"返回bool的谓词函数 +assert/require消费布尔值"的模式,是 Sway 智能合约中可读且高效的验证范式。

常见误区与要点

  1. !只作用于布尔值!bool是逻辑取反;若用于数值类型则触发Not的按位取反实现,两者语义不同,勿混用。
  2. 比较运算结果必为bool==!=<>的返回值类型是bool,可直接作为if条件或传入assert
  3. 隐式返回:函数体最后一个表达式即为返回值,returns_true示例正是利用这一点省略了return关键字。
  4. 编译期类型确定:Sway 静态类型系统要求布尔值在编译期确定类型,let x = true;会由编译器推断为bool,无需(也可)显式标注。

总结

Sway 的bool类型以true/false两个具名值承载二元状态,底层对应数值1/0,由sway-astLitBool字面量解析支撑。它在if表达式、比较运算、断言与权限校验中无处不在;一元运算符!通过标准库Nottrait(内部实现为__eq(self, false))完成逻辑取反。掌握布尔语义,是编写安全、可验证的 Sway 智能合约的第一步。

进一步阅读:if 表达式、变量、内置类型总览。

【免费下载链接】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 15:34:00

RS485通信Proteus仿真与51单片机UART收发实践详解

简介&#xff1a;一套基于51单片机与RS485协议的PC串口通信Proteus仿真设计包&#xff0c;以AT89S52为控制核心&#xff0c;结合MAX485电平转换芯片&#xff0c;帮助学习者在无硬件条件下掌握UART收发、方向控制及总线冲突规避等关键知识点。压缩包共56个文件&#xff0c;大小约…

作者头像 李华
网站建设 2026/9/12 15:33:22

工控机型号解码:从命名规则看硬件能力与产线适配

1. 工控机不是“加了铁壳的电脑”&#xff0c;它是工业现场的神经节点 很多人第一次听说工控机&#xff0c;下意识觉得就是“把普通电脑塞进个厚铁盒里&#xff0c;再加个风扇”。我刚入行那会儿也这么想&#xff0c;直到在一家汽车焊装车间调试PLC通信模块——那台标着“研华A…

作者头像 李华
网站建设 2026/9/12 15:25:18

C语言学习笔记整理方法与实战技巧

1. 为什么需要整理C语言笔记作为一门经典的编程语言&#xff0c;C语言至今仍是计算机科学教育的基础课程。我在大学时期第一次接触C语言时&#xff0c;面对指针、内存管理等概念曾一度感到困惑。后来通过系统地整理学习笔记&#xff0c;不仅帮助我建立了完整的知识框架&#xf…

作者头像 李华