为什么字符串数组需要infix const?

问题描述

我正在慢慢学习zig,但是我不了解const及其与数组/类型的交互方式-我正在研究https://ziglang.org/documentation/0.6.0/#Introduction,但他们经常在字符串中使用const。

它将编译:

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

没有const是错误:

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

error: expected type '[]u8',found '*const [6:0]u8'

类似地,将const放在左侧是相同的错误:

const n  = [_][]u8 {"test 1","zz"};

将const关键字放在中间,实际上是指示编译器执行的方式是什么?

解决方法

在Zig中,const适用于声明中的下一个内容。

因此[_][] u8u8个切片的数组,而[_][] const u8const 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';

[_][] const u8-切片是可变的,但其中的内容不是可变的。

var belong_to_us = [_][]const u8{ "all","your","base","are" };
var bomb = [_][]const u8{ "someone","set","up","us" };
belong_to_us = bomb;

但是

bomb[0][0] = 'x'; // error: cannot assign to constant

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

但是,

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

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

最后一个是可变u8可变切片的恒定数组。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...