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(假)。从底层表示看,布尔值由数值1或0表达,语言为其提供了true与false两个具名值,使代码可读性更高。
Sway 是一门静态类型语言,所有值的类型在编译期必须已知(详见 Built-in Types 概览)。bool是 Sway 提供的原始(primitive)类型之一,与u8/u16/u32/u64/u256、str/str[n]、b256等类型并列,其他复合类型(数组、元组、结构体、枚举)均由这些原始类型构造而来。
从语法解析层面看,true与false属于字面量(literal)的一种:sway-ast中的Literal::Bool携带LitBool节点(sway-ast/src/literal.rs),其中LitBoolType明确区分True与False两种枚举变体,并可无缝转换为 Rust 的bool(LitBoolType::True => true,LitBoolType::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 中if、else if、else表达式的分支条件必须求值为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)取反运算符!,用于翻转布尔值:
true→falsefalse→true
这一运算符由标准库中的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的取反并非单纯的位翻转,而是通过内建指令__eq与false比较得出:若self为true,true == false得false;若self为false,false == false得true,从而精确完成语义取反。这也解释了为什么示例中!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) -> bool、AssetId::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 智能合约中可读且高效的验证范式。
常见误区与要点
!只作用于布尔值:!对bool是逻辑取反;若用于数值类型则触发Not的按位取反实现,两者语义不同,勿混用。- 比较运算结果必为
bool:==、!=、<、>的返回值类型是bool,可直接作为if条件或传入assert。 - 隐式返回:函数体最后一个表达式即为返回值,
returns_true示例正是利用这一点省略了return关键字。 - 编译期类型确定:Sway 静态类型系统要求布尔值在编译期确定类型,
let x = true;会由编译器推断为bool,无需(也可)显式标注。
总结
Sway 的bool类型以true/false两个具名值承载二元状态,底层对应数值1/0,由sway-ast的LitBool字面量解析支撑。它在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),仅供参考