无论切片位置如何,对现有切片的进一步切片总是会产生相同的数据

Further slicing of an existing slice always results in the same data, regardless of slice position

我是 Zig 的新手(使用 0.9.1 稳定版)并且在编译时有效地切片数组时遇到了一些麻烦。

const some_file = @embedFile("filepath.bin");
const data_section = some_file[0x1000..0x2000];

// This has the correct data
const data1 = data_section[0x000..0x100];

// These are identical to data1?
const data2 = data_section[0x100..0x200];
const data2b = data_section.*[0x100..0x200];

我通过省略 data_section:

解决了这个问题
const some_file = @embedFile("filepath.bin");
const data_offset = 0x1000;
const data_length = 0x1000;

const data1 = some_file[data_offset..data_offset + 0x100];
const data2 = some_file[data_offset + 0x100..data_offset + 0x200];

这些似乎都解析为类型 []const u8,但我很困惑为什么在第一个示例中,data1data2 会包含完全相同的数据。与第一个示例一起使用会产生更清晰、更简洁的代码。

因为我是新手,如果我对数组和切片有什么误解,我不会感到惊讶,但上面的内容非常不直观,让我困惑了一段时间,因为我想不通我的代码的哪一部分导致所有数据块与第一个数据块相同。为什么第一个示例会这样?

第 2 个示例中的切片语法错误 (slice[x, y])。您必须使用三点语法,就像您的第一个示例一样。

更正代码:

const some_file = @embedFile("filepath.bin");
const data_offset = 0x1000;
const data_length = 0x1000;

const data1 = some_file[data_offset..data_offset + 0x100];
const data2 = some_file[data_offset + 0x100..data_offset + 0x200];

我确认这是一个 Zig 编译器错误:https://github.com/ziglang/zig/issues/10684

针对 0.11.0 的修复。