从 Rust 中的函数返回未知大小的多维数组

伍迪1193

我有一个特征,MyTrait,它定义了一个方法,该方法my_func返回一个未知大小的数组。这样做的原因是从该方法返回的数组的大小将取决于实现 trait 的结构。因此,方法定义如下所示:

MyTrait<T: Clone + Float> {
    fn my_func() -> &[&[T]];
}

现在,我正在尝试使用以下方法实现此特征:

impl MyStruct {
    const matrix_desc: [[u32; 4]; 4] = [
        [1, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]
    ];
}

impl MyTrait<u32> for MyStruct {
    fn my_func() -> &[&[u32]] {
        &matrix_desc
    }
}

但是,我不断收到错误消息,说存在类型不匹配,并且 Rust 期望 a&[&[u32]]但得到了&[[u32; 4]; 4]. 这对我来说很清楚,但我不知道如何解决它。我也试过使用这个Sized特性,但我似乎无法让它发挥作用。有谁知道如何在编译时返回未知大小的数组?

另外,对于奖励积分,有谁知道我如何强制这个二维数组为正方形?

扬·胡德克

已知长度数组是直接包含在包含对象中的值。所以 a[[u32; 4]; 4]是一个 16u32的内存块您可以将它转换为 a &[[u32;4]],它是一个指针和行数,但&[&[u32]]想要指向一个指针大小对的数组,并且在原始值中不存在。

就像在 C 中一样,嵌套数组不是特别好用。我可能会走这条路线,将它展[u32; 4 * 4]&[u32]并可能用一些定义std::ops::Index<(usize, usize)>. 这立即强制矩阵为矩形(a&[&[u32]]可以具有不同长度的每一行),您可以进一步检查它在 index 方法(以及您为代数定义的任何其他方法)中实际上是正方形。

或者只是尝试在 crates.io 上找到一个已经写好的矩阵库——我很确定会有一些。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章