我正在自学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发布于 2020-10-20 15:05:34
运算符通过值获取其参数。这允许进行优化,例如,如果在操作后不再需要输入,则对输出重用相同的内存。在ndarray中,加法也是implemented for references的,所以你可以简单地借用操作数来告诉编译器你想在以后继续使用它们。然而,乘法只对拥有的值实现(我不知道为什么),所以您需要克隆a或在两行中执行操作,以便可以在第二行中移动a:
let b = a.clone() * (&a-0.5) * (&a+2.0);或
let b = (&a-0.5) * (&a+2.0);
let b = a * b;
// Can't use a from now onhttps://stackoverflow.com/questions/64438708
复制相似问题