我有一个特征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数组为正方形吗?
答案 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];
}