可选类型 (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
另请参阅: