Zig 编译器是否将具有 comptime 可变长度的数组视为可能的零长度数组?
Does the Zig compiler consider arrays with comptime variable lengths as possible zero length arrays?
我正在 Zig 中试验 n 维数组。
const expectEqual = std.testing.expectEqual;
fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
if (shape.len == 0) {
// zero dimensional array, return the scalar type
return u8;
} else {
return struct {
// positive dimensional array, return an array of arrays one dimension lower
data: [shape[0]]NdArray(n - 1, shape[1..].*)
};
}
}
test "NdArray test" {
const expected = struct {
data: [2]struct {
data: [6]struct {
data: [9]struct {
data: u8
}
}
}
};
expectEqual(NdArray(3, [3]comptime_int{ 2, 6, 9 }), expected);
}
但是我得到一个编译错误:
11:25: error: accessing a zero length array is not allowed
data: [shape[0]]NdArray(n - 1, shape[1..].*)
^
当 shape
的长度为零时,我看不到编译器有任何方法可以到达第 11 行。编译器是否只是禁止 shape
的索引,因为它没有用整数文字表示的长度?
更多的是扩展评论而不是答案,我认为正如 tuket
所说,这似乎与编译器相关。我期待比我即将给出的解释更好的解释 =D
看起来 struct
子作用域(如果适用于此)在外部作用域之前被求值。如果将 shape[0]
引用转移到父范围,它似乎可以工作:
fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
if (shape.len == 0) {
// zero dimensional array, return the scalar type
return u8;
} else {
var foo = shape[0];
return struct {
// positive dimensional array, return an array of arrays one dimension lower
data: [foo]NdArray(n - 1, shape[1..].*)
};
}
}
由于您的错误将来自此递归的最后一遍,另一种选择是以 non-recursive 方式重写它。
我正在 Zig 中试验 n 维数组。
const expectEqual = std.testing.expectEqual;
fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
if (shape.len == 0) {
// zero dimensional array, return the scalar type
return u8;
} else {
return struct {
// positive dimensional array, return an array of arrays one dimension lower
data: [shape[0]]NdArray(n - 1, shape[1..].*)
};
}
}
test "NdArray test" {
const expected = struct {
data: [2]struct {
data: [6]struct {
data: [9]struct {
data: u8
}
}
}
};
expectEqual(NdArray(3, [3]comptime_int{ 2, 6, 9 }), expected);
}
但是我得到一个编译错误:
11:25: error: accessing a zero length array is not allowed
data: [shape[0]]NdArray(n - 1, shape[1..].*)
^
当 shape
的长度为零时,我看不到编译器有任何方法可以到达第 11 行。编译器是否只是禁止 shape
的索引,因为它没有用整数文字表示的长度?
更多的是扩展评论而不是答案,我认为正如 tuket
所说,这似乎与编译器相关。我期待比我即将给出的解释更好的解释 =D
看起来 struct
子作用域(如果适用于此)在外部作用域之前被求值。如果将 shape[0]
引用转移到父范围,它似乎可以工作:
fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
if (shape.len == 0) {
// zero dimensional array, return the scalar type
return u8;
} else {
var foo = shape[0];
return struct {
// positive dimensional array, return an array of arrays one dimension lower
data: [foo]NdArray(n - 1, shape[1..].*)
};
}
}
由于您的错误将来自此递归的最后一遍,另一种选择是以 non-recursive 方式重写它。