不能使用二维数组的 .len

问题描述

我有一个无法编译的简单代码

const s = [_][_]int {
    [_]int{08,02,22,97,38,15,00},[_]int{49,49,99,40,17,81,18},[_]int{81,31,73,55,79,14},[_]int{52,70,95,23,04,60,11},[_]int{22,16,71,51,67,63},[_]int{24,47,32,03,45},[_]int{32,98,28,64,67},[_]int{67,26,20,68,62,12},58,05,66,99},[_]int{21,36,09,75,00,76}
};

pub fn main() void
{
    const w = s[0].len;
    const h = s.len;
}

编译器说:

./a.zig:1:14: error: inferred array size invalid here
const s = [_][_]int {
             ^
./a.zig:16:15: note: referenced here
    const w = s[0].len;

有什么问题?

解决方法

我很想知道有一个更深层次的原因,但我的简单理解是当前的语法 [N]T 允许使用 _ 来省略数组大小,但不能超过一个维度。

因此,您可以使用以下方法解决您的问题(注意,我使用了 u8,因为我不确定您的 int 是什么):

const s = [_][7]u8{
  // Your items
}

我怀疑这是因为解析规则的应用方式,所以 [7]u8 将是嵌套数组将保存的类型,编译器将使用它来检查内容是否都是 {{1 }};您可以通过将其中一行修改为具有 6 个元素并检查由此产生的错误来确认这一点。

如果您想要可变数量的项目,您可以开始查看切片数组:[7]u8,但我认为这不是您目前想要的。