常量
常量是为模块
或脚本
中的共享静态值命名的一种方式.
常量的值必须在编译时确定.常量的值会被存储在编译后的模块或脚本中.每次使用常量时,都会创建该值的一个新副本.
常量声明以const
关键字开头,后跟名称,类型和值.它们可以存在于脚本或模块中.
const <名称>: <类型> = <表达式>;
例如
script { const MY_ERROR_CODE: u64 = 0;
fun main(input: u64) { assert!(input > 0, MY_ERROR_CODE); }}
module 0x42::example { const MY_ADDRESS: address = @0x42;
public fun permissioned(s: &signer) { assert!(std::signer::address_of(s) == MY_ADDRESS, 0); }}
常量必须以大写字母A
到Z
开头.首字母之后,常量名称可以包含下划线_
,小写字母a
到z
,大写字母A
到Z
或数字0
到9
.
script { const FLAG: bool = false; const MY_ERROR_CODE: u64 = 0; const ADDRESS_42: address = @0x42;}
虽然常量中可以使用小写字母a
到z
,但根据通用风格指南,建议只使用大写字母A
到Z
,单词之间用下划线_
分隔.
这种以A
到Z
开头的命名限制是为了给未来的语言特性留出空间,后续可能会也可能不会移除该限制.
目前不支持public
常量.const
值只能在声明它的模块中使用.
目前常量仅限于基本类型:bool
,u8
,u16
,u32
,u64
,u128
,u256
,address
和vector<u8>
.未来将会支持其他vector
值(除了”字符串”风格的字面量).
通常,const
会被赋予其类型的简单值或字面量.例如:
script { const MY_BOOL: bool = false; const MY_ADDRESS: address = @0x70DD; const BYTES: vector<u8> = b"hello world"; const HEX_BYTES: vector<u8> = x"DEADBEEF";}
除了字面量外,只要编译器能够在编译时将表达式简化为值,常量也可以包含更复杂的表达式.
目前可以使用相等运算,所有布尔运算,所有位运算和所有算术运算.
script { const RULE: bool = true && false; const CAP: u64 = 10 * 100 + 1; const SHIFTY: u8 = { (1 << 1) * (1 << 2) * (1 << 3) * (1 << 4) }; const HALF_MAX: u128 = 340282366920938463463374607431768211455 / 2; const REM: u256 = 57896044618658097711785492504343953926634992332820282019728792003956564819968 % 654321; const EQUAL: bool = 1 == 1;}
如果操作导致运行时异常,编译器会报错表示无法生成常量的值.
script { const DIV_BY_ZERO: u64 = 1 / 0; // 错误! const SHIFT_BY_A_LOT: u64 = 1 << 100; // 错误! const NEGATIVE_U64: u64 = 0 - 1; // 错误!}
请注意,目前常量不能引用其他常量.该功能以及对其他表达式的支持将在未来版本中添加.