Zig 數組元素的可變性

fn printNames(names: [][]const u8) void {
    for (names, 1..) |n, i| {
        std.debug.print("{d}. {s}\n", .{ i, n });
    }
}

如果一個函數的參數是切片的切片,比如上面的 printNames,調用是怎麼寫呢?一個簡單的方式:

pub fn main() !void {
    const names = [_][]const u8{ "Tom", "John", "James" };
    printNames(&names);
}

zig run main.zig 後試試:

main.zig:12:16: error: expected type '[][]const u8', found '*const [3][]const u8'
    printNames(&names);
               ^~~~~~
main.zig:12:16: note: cast discards const qualifier
main.zig:4:22: note: parameter type declared here
fn printNames(names: [][]const u8) void {
                     ^~~~~~~~~~~~

一般來說,直接對數組取地址就可以轉化爲對應的切片,但是這裏竟然報錯了,說是實際傳入了個指針,這是爲什麼呢?

這個問題產生的原因是這樣的:

一個解決方式是直接用 var 來定義 names。但這樣不好,更好的做法是讓 printNames 的切片參數不可變,

fn printNames(names: []const []const u8) void

改成這樣就表示 names 參數不可變了。

這裏容易混淆的是,切片元素的可變性是由類型決定的,比如 []const u8,而數組元素的可變性是在定義數組變量時確定的,比如 var names = ...

這裏初看上去有些不一致,但確實 Andrew 深思熟慮的,大家可以參考這個 issue:Explicit use of the 'var' keyword for pointers and arrays to mutable data · Issue #5056 · ziglang/zig[1]

加入我們

Zig 中文社區是一個開放的組織,我們致力於推廣 Zig 在中文羣體中的使用,有多種方式可以參與進來:

  1. 1. 供稿,分享 [2] 自己使用 Zig 的心得

    1. 改進 ZigCC 組織下的開源項目 [3]
    1. 加入微信羣 [4]

引用鏈接

[1] Explicit use of the 'var' keyword for pointers and arrays to mutable data · Issue #5056 · ziglang/zig: https://github.com/ziglang/zig/issues/5056
[2] 供稿,分享: https://ziglang.cc/contributing
[3] 開源項目: https://ask.ziglang.cc/github
[4] 微信羣: https://ask.ziglang.cc/weixin

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/JlCq0EKv6ewmuGM6CxoQrg