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 {
^~~~~~~~~~~~
一般來說,直接對數組取地址就可以轉化爲對應的切片,但是這裏竟然報錯了,說是實際傳入了個指針,這是爲什麼呢?
這個問題產生的原因是這樣的:
-
• printNames 的參數是切片的切片,並且第一維度的切片是可以改變的
-
• 但 names 對應的數組是 const 的,也就是說不能改變,因此有了上面的錯誤
一個解決方式是直接用 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. 供稿,分享 [2] 自己使用 Zig 的心得
-
- 改進 ZigCC 組織下的開源項目 [3]
-
- 加入微信羣 [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