我有一个特征,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] 删除。
我来说两句