为什么字符串数组需要中缀 const?
Why is infix const required for arrays of strings?
我正在慢慢学习 zig,但我不了解 const 以及它如何与 arrays/types 交互 - 我正在学习 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", "test4", "test 6", "zz"};
error: expected type '[]u8', found '*const [6:0]u8'
类似的,把const放在左边也是同样的错误:
const n = [_][]u8 {"test 1", "test4", "test 6", "zz"};
将 const 关键字放在中间的实际指示编译器做什么的是什么?
在 Zig 中,const
适用于声明中的下一个事物。
所以 [_][] u8
是 u8
个切片的数组,而 [_][] const u8
是 const u8
个切片的数组。您的字符串文字是 *const [_:0]u8
(指向 u8 的空终止数组的指针;这是错误消息中 *const [6:0] u8
的来源),Zig 可以将其强制转换为 const u8
.[= 的切片28=]
一些示例以及它们的可变性:
[_][]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 切片的常量数组。
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
.
切片的常量数组
我正在慢慢学习 zig,但我不了解 const 以及它如何与 arrays/types 交互 - 我正在学习 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", "test4", "test 6", "zz"};
error: expected type '[]u8', found '*const [6:0]u8'
类似的,把const放在左边也是同样的错误:
const n = [_][]u8 {"test 1", "test4", "test 6", "zz"};
将 const 关键字放在中间的实际指示编译器做什么的是什么?
在 Zig 中,const
适用于声明中的下一个事物。
所以 [_][] u8
是 u8
个切片的数组,而 [_][] const u8
是 const u8
个切片的数组。您的字符串文字是 *const [_:0]u8
(指向 u8 的空终止数组的指针;这是错误消息中 *const [6:0] u8
的来源),Zig 可以将其强制转换为 const u8
.[= 的切片28=]
一些示例以及它们的可变性:
[_][]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 切片的常量数组。
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
.