Skip to content

可选类型(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
        }
    }
}