iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

如果你想要一個可選的數值,那 Optional 是一個好選擇。

類似於 Rust 的 Option<T>,Zig 的 Optional 提供數值被賦予 null 的能力,以代表空、沒有。

基本

在宣告時個型別前加上 ? 使其變成可選類型。

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});
}
Value: null
Value: 32

orelse

可以使用 orelse 來展開(unwrap)可選型別,將其變成一般的子型別。

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)});
}
Value: 32
Value: 128
Type: u8

unreachable

如果你確定該可選值目前不是 null,可以使用 .? 直接展開成子型別的數值。如果對 null 進行 .? 會在執行期引發 Painc 錯誤。

value.?value orelse unreachable 具有相同的效果。

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});
}
Value: 32
thread 55352 panic: attempt to use null value

參考

本文以 Zig 0.13.0 爲主。並同時發佈在:


上一篇
Zig:陣列(Array)和切片(Slices)
下一篇
Zig:指標(Pointer)
系列文
Zig 語言入門指南——聽説你是現代化的 C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言