跳转到内容

可选项

类型系统概述中提到,所有原始类型结构体消息都可以为空。也就是说,除了 null(一种特殊值,表示故意没有任何其他值)之外,它们不一定持有任何值。

变量结构消息中可容纳 null 的字段被称为”可选项”。当变量不一定被使用时,它们对减少状态大小很有用。

在变量或字段的类型声明后添加问号 (?),就可以将其设为可选变量或字段。唯一的例外是 map<K, V>bounced<Msg>,你不能让它们、内部键/值类型(如果是 map)或内部消息(如果是 bounced)成为可选项。

未定义的可选变量或可选字段默认为 null 值。如果不先检查 null,就无法访问它们。但如果你确定它们在某一时刻不是 null,可以使用非空断言操作符 !!访问它们的值。

在未使用 !!或未事先检查 null 的情况下尝试访问可选变量或可选字段的值,如果编译器可以跟踪,则会导致编译错误;如果不能跟踪,则会导致退出代码 128异常:空引用异常。

可选项举例:

struct StOpt {
optInt?; // Int 或 null
}
message MsOpt {
optStOpt?; // 注意,在此定义中如何使用 struct StOpt
}
contract Optionals {
optInt?;
addressAddress?;
init(opt: Int?) { // optionals as parameters
self.opt = opt;
self.address = null; // explicit null value
}
receive(msg: MsOpt) {
let opt= 12; // defining a new variable
if (self.opt != null) { // explicit check
self.opt = opt!!; // using !! as we know that opt value isn't null
}
}
}