可选类型 (Optionals)

可选类型表示一个值可能存在,也可能不存在(即为 null)。语法是在类型名称前加 ?

声明

var optional_i32: ?i32 = null;
optional_i32 = 1234;

null

null 是一个特殊的值,可以赋值给任何可选类型。

解包 (Unwrapping)

要使用可选类型中的值,必须先将其解包。

使用 orelse

orelse 运算符提供一个默认值,如果可选值为 null,则使用该默认值。

const x: ?i32 = null;
const value = x orelse 0; // value 为 0

orelse 也可以与 unreachable 结合使用,断言值不为 null

const value = x orelse unreachable; // 如果 x 为 null,则 panic

使用 if 捕获

if (optional_i32) |value| {
    std.debug.print("Value is {}\n", .{value});
} else {
    std.debug.print("Value is null\n", .{
});
}

使用 while 捕获

var i: ?u32 = 10;
while (i) |value| : (i = if (value > 0) value - 1 else null) {
    std.debug.print("{}\n", .{value});
}

指针解包

对于可选指针,解包操作 ptr.? 会返回非可选指针。如果指针为 null,这是一种非法行为(在 Debug 模式下 panic)。

可选指针 (Optional Pointers)

可选指针具有与 C 指针相同的内存布局(0 表示 null)。这使得 Zig 的可选指针可以与 C API 无缝交互。

const ptr: ?*i32 = null; // 内存中表示为 0

另请参阅: