微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Zig编译器是否将具有comptime可变长度的数组视为可能的零长度数组?

如何解决Zig编译器是否将具有comptime可变长度的数组视为可能的零长度数组?

我正在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..].*)
        };
    }
}

由于您的错误将来自此递归的最后一次传递,因此另一种选择是以非递归的方式重写它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。