我遇到了生锈的问题,我很难搞清楚。我已经尝试了很多调整,但我不断引入新的错误。我希望索引返回一个Vector对象。
我有:
struct Matrix<T> {
num_rows: i32,
num_cols: i32,
data: Vec<T>
}
struct Vector<T> {
data: Vec<T>
}
我正在尝试
impl<T: Clone> Index<usize> for Matrix<T> {
type Output = Vector<T>;
fn index(&self, i: usize) -> &Vector<T> {
let index = i as i32;
let start = (index * &self.num_cols) as usize;
let end = (((index + 1) * &self.num_cols) - 1) as usize;
let data_slice = &self.data[start..end];
let data = data_slice.to_vec();
let vector_temp = Vector::<T>::new(data);
return &vector_temp;
}
}
但我得到了
error: `vector_temp` does not live long enough
--> src\main.rs:45:17
|
45 | return &vector_temp;
| ^^^^^^^^^^^ does not live long enough
46 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 38:44...
--> src\main.rs:38:45
|
38 | fn index(&self, i: usize) -> &Vector<T> {
| ^
error: aborting due to previous error
error: Could not compile `hello_world`.
我还没有充分了解生锈的生命,所以希望有人可以帮助我。谢谢!
答案 0 :(得分:3)
您尝试返回对函数结束后将被销毁的对象的引用。一旦vector_temp
返回,index
将不再存在,因此返回对它的引用是非法的(因为该引用将指向无处)。
您想要做的是返回您正在创建的切片,让调用者决定如何处理它:
impl<T: Clone> Index<usize> for Matrix<T> {
type Output = [T];
fn index(&self, i: usize) -> &[T] {
let index = i as i32;
let start = (index * &self.num_cols) as usize;
let end = (((index + 1) * &self.num_cols) - 1) as usize;
&self.data[start..end]
}
}
然后,您可以让调用者执行您在原始实现中所做的操作:
let m1 = Matrix { ... };
let owned_vector = m1[index_here].to_owned();
I am not 100% sure where you go from here,鉴于我不确定你会采取多少措施。返回未经过处理的切片可能会出现问题,因此在不知道具体用例的情况下,我不确定是否有更好的方法可以解决这个问题。
希望这有助于解决你的问题。