不能使用二维数组的 .len

Can't use .len of a bidimensional array

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

const s = [_][_]int {
    [_]int{08, 02, 22, 97, 38, 15, 00},
    [_]int{49, 49, 99, 40, 17, 81, 18},
    [_]int{81, 49, 31, 73, 55, 79, 14},
    [_]int{52, 70, 95, 23, 04, 60, 11},
    [_]int{22, 31, 16, 71, 51, 67, 63},
    [_]int{24, 47, 32, 60, 99, 03, 45},
    [_]int{32, 98, 81, 28, 64, 23, 67},
    [_]int{67, 26, 20, 68, 02, 62, 12},
    [_]int{24, 55, 58, 05, 66, 73, 99},
    [_]int{21, 36, 23, 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 允许使用 _ 省略数组大小,但不允许更多比一维。

因此您可以使用以下方法解决您的问题(N.B。我使用 u8 因为我不确定您的 int 是什么):

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

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

如果您想要可变数量的项目,您可以开始研究切片数组:[_][]u8,但我认为这不是您目前所追求的。