1

ライフタイムを使用していくつかの特性を実装しようとしていますが、いつものように借用チェッカーと戦っています。

私の特性は次のようになります。

pub struct Matrix<T> {
    pub cols: usize,
    pub rows: usize,
    pub data: Vec<T>
}

impl<'a, 'b, T: Copy + Mul<T, Output=T>> Mul<&'b T> for &'a Matrix<T> {
    type Output = Matrix<T>;

    fn mul(self, f: &T) -> Matrix<T> {
        let new_data : Vec<T> = self.data.into_iter().map(|v| v * (*f)).collect();

        Matrix {
            cols: self.cols,
            rows: self.rows,
            data: new_data
        }
    }
}

遊び場リンク

これにより、次のエラーが発生します。

error: cannot move out of borrowed content

なぜこれが起こっているのか理解していると思います.自己を借りているので、データをコピーできません. どうすればこれを回避できますか?

4

1 に答える 1

3

これはinto_iter()、ベクターを使用しているために発生します。にCopyバインドしたのでT、これは不要です。iter()クロージャーで引数を使用して逆参照することができます:

pub struct Matrix<T> {
    pub cols: usize,
    pub rows: usize,
    pub data: Vec<T>
}

impl<'a, 'b, T: Copy + Mul<T, Output=T>> Mul<&'b T> for &'a Matrix<T> {
    type Output = Matrix<T>;

    fn mul(self, f: &T) -> Matrix<T> {
        let new_data: Vec<T> = self.data.iter().map(|v| *v * *f).collect();

        Matrix {
            cols: self.cols,
            rows: self.rows,
            data: new_data
        }
    }
}

(遊び場)

于 2015-12-10T09:15:00.783 に答える