为什么字符串数组需要中缀常量?

Nea*_*ltz 6 zig

我正在慢慢学习 zig,但我不了解 const 以及它如何与数组/类型交互 - 我正在浏览https://ziglang.org/documentation/0.6.0/#Introduction 但他们经常使用 const字符串。

这编译:

var n  = [_][]const u8 {"test 1", "test4", "test   6", "zz"};
Run Code Online (Sandbox Code Playgroud)

没有const是一个错误:

var n  = [_][] u8 {"test 1", "test4", "test   6", "zz"};

error: expected type '[]u8', found '*const [6:0]u8'
Run Code Online (Sandbox Code Playgroud)

同样,将 const 放在左侧也是同样的错误:

const n  = [_][]u8 {"test 1", "test4", "test   6", "zz"};
Run Code Online (Sandbox Code Playgroud)

是什么把 const 关键字放在中间,这样实际上指导编译器做什么?

nmi*_*els 7

在 Zig 中,const适用于声明中的下一件事情。

所以[_][] u8是一个数组u8片,虽然[_][] const u8是切片的阵列const u8。您的字符串文字是*const [_:0]u8(指向以空字符结尾的 u8 数组的指针;这是*const [6:0] u8错误消息中的 来源),Zig 可以将其强制转换为const u8.

一些示例以及它们的可变性:

[_][]u8 - 一切都是可变的。

var move: [3][]u8 = undefined;
var ziga: [4]u8 = [_]u8{ 'z', 'i', 'g', 's' };
const zigs: []u8 = ziga[0..];
move[0] = zigs;
move[0][1] = 'a';
Run Code Online (Sandbox Code Playgroud)

[_][] const u8 - 切片是可变的,但里面的东西不是。

var belong_to_us = [_][]const u8{ "all", "your", "base", "are" };
var bomb = [_][]const u8{ "someone", "set", "up", "us" };
belong_to_us = bomb;
Run Code Online (Sandbox Code Playgroud)

bomb[0][0] = 'x'; // error: cannot assign to constant
Run Code Online (Sandbox Code Playgroud)

const [_][] const u8 - 整件事是不可变的。

const signal: [3][]const u8 = [_][]const u8{ "we", "get", "signal" };
const go: [3][]const u8 = [_][]const u8{ "move", "every", "zig" };
signal = go; // error: cannot assign to constant
Run Code Online (Sandbox Code Playgroud)

然而,

const [_][]u8 - 这是 u8 切片的常量数组。

var what: [4]u8 = [_]u8{ 'w', 'h', 'a', 't' };
const signal: [3][]u8 = [_][]u8{ zigs, what[0..], zigs };
signal[0][1] = 'f'; // Legal!
signal[1] = zigs; // error: cannot assign to constant
Run Code Online (Sandbox Code Playgroud)

最后一个是 mutable 切片的常量数组u8