问题描述
我正在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..].*)
};
}
}
由于您的错误将来自此递归的最后一次传递,因此另一种选择是以非递归的方式重写它。