#arrays #multidimensional-array #rust
#массивы #многомерный массив #Ржавчина
Вопрос:
Я сам изучаю rust-ndarray и написал этот простой код.
use ndarray::prelude::*;
fn main() {
let mut a = Array2::<f64>::ones((3, 3));
let b = (a*(a-0.5))*(a 2.0);
println!("{:?}",b);
}
Я ожидал, что результат будет
[[ 1.5, 1.5, 1.5],
[ 1.5, 1.5, 1.5],
[ 1.5, 1.5, 1.5]]
Но он выдает эту ошибку
| let b = (a*(a-0.5))*(a 2.0);
| ------- ^ value used here after move
| |
| `a` moved due to usage in operator
Ответ №1:
Операторы принимают свои аргументы по значению. Это позволяет оптимизировать, например, повторно использовать ту же память для вывода, если вам больше не нужен ввод после операции. В ndarray добавление также <a rel="noreferrer noopener nofollow" href="https://docs.rs/ndarray/0.13.1/ndarray/struct.ArrayBase.html#impl-Add<&'a ArrayBase>-1″ rel=»nofollow noreferrer»>реализовано для ссылок, поэтому вы можете просто позаимствовать операнды, чтобы сообщить компилятору, что вы хотите продолжать использовать их позже. Однако умножение реализовано только для принадлежащих значений (я не уверен, почему), поэтому вам нужно будет либо клонировать a
, либо выполнять операции в двух строках, чтобы вы могли перейти a
во вторую строку:
let b = a.clone() * (amp;a-0.5) * (amp;a 2.0);
или
let b = (amp;a-0.5) * (amp;a 2.0);
let b = a * b;
// Can't use a from now on
Комментарии:
1. не
mut
используется ли ключевое слово для подобных проблем и помогло бы многократно использовать одну и ту же переменную?2. @Eka Невозможно (безопасно) получить право собственности на
mut
ссылку.3. Это не вопрос изменяемого или не изменяемого, это вопрос перемещения или заимствования. Если вы перемещаете значение, вы не можете его повторно использовать, тогда как вы можете заимствовать значение более одного раза (при условии, что ни одно из заимствований не является
mut
).