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

时间:2019-06-11 04:34:33

标签: arrays rust

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

my_func

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

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

但是,我不断收到错误消息,指出存在类型不匹配,并且Rust期望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 } } 但得到&[&[u32]]。这对我来说很清楚,但我不确定如何解决。我也尝试过使用&[[u32; 4]; 4]特质,但似乎无法正常工作。有谁知道我可以在编译时返回未知大小的数组?

还有,为了获得奖励积分,有人知道我如何迫使这个2d数组为正方形吗?

2 个答案:

答案 0 :(得分:2)

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

像C一样,嵌套数组并不是特别好用。我可能会选择将其展平到[u32; 4 * 4]&[u32]的路线,并可能用定义std::ops::Index<(usize, usize)>的东西包装它。这立即迫使矩阵为矩形(&[&[u32]]的每一行可以具有不同的长度),并且您可以进一步在index方法(以及为代数定义的任何其他方法)中检查它是否确实为正方形。 / p>

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

答案 1 :(得分:1)

如果可以将matrix_desc声明为切片,则应该可以:

struct MyStruct;

impl MyStruct {
    const matrix_desc: &'static [&'static [u32]] = &[
        &[1, 0, 0, 0],
        &[0, 1, 0, 0],
        &[0, 0, 1, 0],
        &[0, 0, 0, 1]
    ];
}

trait MyTrait<T> {
    fn my_func() -> &'static [&'static [T]];
}

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

目前似乎对固定大小和通用大小的数组的支持不是很好。例如,这不起作用:

trait MyTrait<T> {
    const SIZE: usize;
    fn my_func() -> [[T; SIZE]; SIZE];
}