Answer the question
In order to leave comments, you need to log in
Question about ownership in Rust, what's wrong?
Good day!
I'm trying to implement matrix multiplication and stumbled upon a problem with ownership.
I am getting "borrow of moved value: `buf`" error.
// вектор, где будут хранится произведения матриц
let mut result =vec![];
// матрица которая будет буфером куда будет записано произведение матриц
let mut buf:Matrix<i32> = Matrix::new(3, 1);
for (i:usize,v:Matrix) in layers.iter().enumerate() {
// если слой(матрица) входной то
if i ==0 {
// умножаем первый слой на входящую матрицу
buf = v.mat_mul(&input);
// результат записываем в вектор результатов
result.push(buf);
}else {
// умножаем слой на предыдущую матрицу
buf = v.mat_mul(&buf);
// результат записываем в вектор результатов
result.push(buf);
}
}
let mut buf:Matrix<i32> = Matrix::new(3, 1);
| ------- move occurs because `buf` has type `matrix::Matrix<i32>`, which does not implement the `Copy` trait
...
result.push(buf);
| --- value moved here, in previous iteration of loop
...
80 | buf = v.mat_mul(&buf);
| ^^^^ value borrowed here after move
81 |
82 | result.push(buf);
| --- value moved here, in previous iteration of loop
Answer the question
In order to leave comments, you need to log in
The thing is, just like the compiler said, you are trying to use the value after it has been moved.
Let's take a look at the code section.
// умножаем слой на предыдущую матрицу
buf = v.mat_mul(&buf);
// результат записываем в вектор
result.push(buf);
// умножаем слой на предыдущую матрицу
buf = v.mat_mul(&buf);
// результат записываем в вектор
result.push(buf.clone());
// вектор, где будут хранится произведения матриц
let mut result = vec![];
for v in layers {
// пытаемся достать предыдущую матрицу
let previous_matrix = match result.last() {
Some(last) => last,
// а если таковой нет - ей станет входная
None => &input,
};
// умножаем слой на предыдущую (или входную) матрицу
let next_matrix = v.mat_mul(previous_matrix);
result.push(next_matrix);
}
Vec::<T>::last
returns Option<&T>
, which contains a reference to the last element of the vector, if one exists. Its complexity is O(1), so you don't have to worry about performance degradation. Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question