【发布时间】:2019-06-11 04:34:33
【问题描述】:
我有一个 trait,MyTrait,它定义了一个名为 my_func 的方法,它返回一个未知大小的数组。这样做的原因是从这个方法返回的数组的大小将取决于实现 trait 的结构。因此,方法定义如下所示:
MyTrait<T: Clone + Float> {
fn my_func() -> &[&[T]];
}
现在,我正在尝试使用以下方法实现此 trait:
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 期望 &[&[u32]] 但得到 &[[u32; 4]; 4]。这对我来说很清楚,但我不知道如何解决它。我也尝试过使用 Sized 特征,但我似乎无法让它发挥作用。有谁知道我如何在编译时返回未知大小的数组?
另外,对于奖励积分,有谁知道我可以如何强制这个二维数组为正方形?
【问题讨论】:
-
这似乎是
Vec会有所帮助的情况。你有什么理由不能返回Vec<Vec<T>>吗? -
@Sunreef,是什么让向量变得如此出色以至于值得 4x4 矩阵?
-
@JanHudec 如果它总是一个 4x4 矩阵,那么你可以使用
[[T;4];4]。但他说他想要未知尺寸。这就是Vec所做的。 -
@Sunreef,你可以用简单的参考做未知尺寸。
Vec添加的东西是所有权。如果不需要,则不应存在。 -
@Sunreef 实现特征时矩阵的实际大小不会改变,我只是不知道特征定义的大小。例如,我可以有一个名为
StructB的第二个结构,它实现了[[T;8];8]。我不希望矩阵大小在实现时发生变化,但我无法确定特征定义中的大小