如果你想要一個可選的數值,那 Optional 是一個好選擇。
類似於 Rust 的 Option<T>
,Zig 的 Optional 提供數值被賦予 null
的能力,以代表空、沒有。
基本
在宣告時個型別前加上 ?
使其變成可選類型。
1 2 3 4 5 6 7 8 9 10 11
| const std = @import("std");
pub fn main() void { var value: ?u8 = null; std.debug.print("Value: {?}\n", .{value});
if (value == null) { value = 32; } std.debug.print("Value: {?}", .{value}); }
|
orelse
可以使用 orelse
來展開(unwrap)可選型別,將其變成一般的子型別。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const std = @import("std");
pub fn main() void { var a: ?u8 = null; const b: u8 = 32; var c = a orelse b; std.debug.print("Value: {}\n", .{c});
a = 128; c = a orelse b; std.debug.print("Value: {}\n", .{c});
std.debug.print("Type: {}", .{@TypeOf(c)}); }
|
1 2 3
| Value: 32 Value: 128 Type: u8
|
unreachable
如果你確定該可選值目前不是 null
,可以使用 .?
直接展開成子型別的數值。如果對 null
進行 .?
會在執行期引發 Painc 錯誤。
value.?
和 value orelse unreachable
具有相同的效果。
1 2 3 4 5 6 7 8 9 10 11
| const std = @import("std");
pub fn main() void { var a: ?u8 = 32; var c = a.?; std.debug.print("Value: {}\n", .{c});
a = null; c = a.?; // painc! std.debug.print("Value: {}\n", .{c}); }
|
1 2
| Value: 32 thread 55352 panic: attempt to use null value
|
參考
本文以 Zig 0.13.0
為主。並同時發佈在: