2015-12-10 2 views
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 
     } 
    } 
} 

площадка link

Это дает следующее сообщение об ошибке:

error: cannot move out of borrowed content 

Я думаю, что я понимаю, почему это происходит: я заимствование себя и поэтому я не могу скопировать данные. Как мне обойти это?

+0

Возможной Дубликат [Невозможно выйти из заимствованного контента при заимствовании общего типа] (http://stackoverflow.com/questions/28595075/can not-move-out-of-заимствованный-content-when-loaning-a-generic-type) –

ответ

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 
     } 
    } 
} 

(playground)

+0

И важно, что 'in_iter' состоит в том, что он потребляет аргумент' self' (http://doc.rust-lang.org/std/iter/trait.IntoIterator.html#tymethod.into_iter): 'fn in_iter (self) -> Self :: IntoIter'. 'iter', с другой стороны, только [требует ссылки] (http://doc.rust-lang.org/std/vec/struct.Vec.html#method.iter) (' & self'). – Shepmaster

+0

Спасибо, что поняли. Я знал, что это должно быть что-то простое! – user124784