常量与变量类似;但是,有一些区别:
impl
作用域中声明。 mut
关键字。 const ID: u32 = 0;
常量的初始化表达式可能相当复杂,但不能使用汇编指令、存储访问、可变变量、循环和return
语句等。尽管如此,函数调用、基本类型和复合数据结构完全可以使用:
fn bool_to_num(b: bool) -> u64 {
if b {
1
} else {
0
}
}
fn arr_wrapper(a: u64, b: u64, c: u64) -> [u64; 3] {
[a, b, c]
}
const ARR2 = arr_wrapper(bool_to_num(1) + 42, 2, 3);
关联常量是与类型相关联的常量,可以在impl
块或trait
定义中声明。
在trait
定义内部声明的关联常量可能省略它们的初始化器,以指示该 trait 的每个实现必须指定这些初始化器。
标识符是路径中使用的常量名称。类型是定义必须实现的类型。
您可以在 trait 的接口表面直接定义关联const
:
script;
trait ConstantId {
const ID: u32 = 0;
}
或者,您也可以在 trait 中声明它,并在实现 trait 的类型的接口中实现它。
script;
trait ConstantId {
const ID: u32;
}
struct Struct {}
impl ConstantId for Struct {
const ID: u32 = 1;
}
fn main() -> u32 {
Struct::ID
}
impl self
常量 常量也可以在非 trait 的impl
块中声明。
script;
struct Point {
x: u64,
y: u64,
}
impl Point {
const ZERO: Point = Point { x: 0, y: 0 };
}
fn main() -> u64 {
Point::ZERO.x
}
可配置常量是特殊的常量,其行为类似于常规常量,因为它们在程序执行期间无法更改,但它们可以在构建 Sway 程序之后配置。Rust 和 TS SDK 允许直接将新值注入这些常量的字节码中,而无需重新构建程序即可更新这些常量的值。这些对于合约工厂非常有用,并且在某种程度上类似于像 Solidity 这样的语言中的immutable
变量。
可配置常量在configurable
块中声明,并且需要类型和初始化器,如下所示:
configurable {
U8: u8 = 8u8,
BOOL: bool = true,
ARRAY: [u32; 3] = [253u32, 254u32, 255u32],
STR_4: str[4] = __to_str_array("fuel"),
STRUCT: StructWithGeneric<u8> = StructWithGeneric {
field_1: 8u8,
field_2: 16,
},
ENUM: EnumWithGeneric<bool> = EnumWithGeneric::VariantOne(true),
}
在 Sway 项目中最多只允许一个configurable
块。此外,不允许在库中使用configurable
块。
可配置常量可以像常规常量一样直接读取:
fn return_configurables() -> (u8, bool, [u32; 3], str[4], StructWithGeneric<u8>) {
(U8, BOOL, ARRAY, STR_4, STRUCT)
}