2017-01-08 7 views
1

私は錆の寿命に問題があります。私は以下にたくさんの調整を試みましたが、私は新しいエラーを導入し続けます。私はインデックスを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; 
    } 
} 

をやろうとしている。しかし、私はまだ完全には錆で寿命をgrokkedいない

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`. 

を取得しています誰かが私を助けてくれることを望んでいた。ありがとう!

答えて

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、私はあなたがこれを取るつもりだどのくらいの更なるか分からない与えられました。サイズの決められていないスライスを返すことで問題が発生する可能性があるので、特定のユースケースを知らなくても、これを処理できる優れた方法があるかどうかはわかりません。

これはあなたの直ちに問題に役立ちます。

関連する問題