Appearance
可选类型(Optionals)
如类型系统概览中所述,所有原始类型、结构体(Structs)和消息(Messages)都可以是可空的。也就是说,它们不一定持有任何值,除了 null — 一个特殊的值,代表故意没有其他任何值。
可以持有 null 的结构体和消息的变量或字段称为“可选类型(optionals)”。当变量不一定被使用时,它们有助于减少状态大小。
你可以通过在类型声明后添加问号(?)来使任何变量或字段成为可选类型。唯一的例外是 map<k, v>
和 bounced<Msg>
,在这些类型中,你不能使它们的内部键/值类型(在 map 的情况下)或内部消息(在 bounced 的情况下)成为可选类型。
未定义的可选变量或可选字段默认持有 null 值。在先检查是否为 null 之前,你不能访问它们。但是,如果你确定在特定时刻它们不是 null,可以使用非空断言操作符 !!
来访问它们的值。
试图在不使用 !!
或事先不检查 null 的情况下访问可选变量或可选字段的值将导致编译错误。
可选类型的示例:
solidity
struct StOpt {
opt: Int?; // Int 或 null
}
message MsOpt {
opt: StOpt?; // 注意,如何在此定义中使用结构体 StOpt
}
contract Optionals {
opt: Int?;
address: Address?;
init(opt: Int?) { // 参数作为可选类型
self.opt = opt;
self.address = null; // 明确的 null 值
}
receive(msg: MsOpt) {
let opt: Int? = 12; // 定义一个新变量
if (self.opt != null) { // 明确检查
self.opt = opt!!; // 使用 !! 因为我们知道 opt 值不是 null
}
}
}