生锈期 - 变量不能长寿错误

时间:2017-01-08 03:30:11

标签: rust lifetime

我遇到了生锈的问题,我很难搞清楚。我已经尝试了很多调整,但我不断引入新的错误。我希望索引返回一个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`.

我还没有充分了解生锈的生命,所以希望有人可以帮助我。谢谢!

1 个答案:

答案 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,鉴于我不确定你会采取多少措施。返回未经过处理的切片可能会出现问题,因此在不知道具体用例的情况下,我不确定是否有更好的方法可以解决这个问题。

希望这有助于解决你的问题。