Constants

Icon Link常量

常量与变量类似;但是,有一些区别:

  • 常量始终在编译时评估。
  • 常量可以在函数内部和全局/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);

Icon Link关联常量

关联常量是与类型相关联的常量,可以在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
}

Icon Linkimpl 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
}

Icon Link可配置常量

可配置常量是特殊的常量,其行为类似于常规常量,因为它们在程序执行期间无法更改,但它们可以在构建 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)
}