我假设您的Point
结构如下所示:
#[derive(Debug)]
struct Point(f64, f64);
impl Point {
fn new(x: f64, y: f64) -> Self { Point(x, y) }
fn origin() -> Self { Point(0.,0.) }
fn distance_to(&self, other: &Point) -> f64 {
((other.0 - self.0).powi(2) + (other.1 - self.1).powi(2)).sqrt()
}
}
现在让我们看一个更简单但无法编译的示例:
let x = Point::new(2.5, 1.0);
let y = x;
let d = x.distance_to(&y);
这给出了错误:
error[E0382]: use of moved value: `x`
--> <anon>:15:13
|
14 | let y = x;
| - value moved here
15 | let d = x.distance_to(&y);
| ^ value used here after move
|
= note: move occurs because `x` has type `Point`, which does not implement the `Copy` trait
因为x
已移入y
,所以它现在不能有引用来调用该distance_to
函数。
这里要注意的重要一点是顺序很重要——如果我们交换线路,我们可以distance_to
通过借用来调用x
,借用将结束,然后 x
可以移入y
。
let x = Point(0., 0.);
let d = x.distance_to(&y);
let y = x; // compiles
在您的情况下,构建元组时发生了非常相似的事情。point
被移动到元组中,然后尝试借用它来形成第二个元素。最简单的解决方案是执行与此处相同的操作:交换元组元素的顺序。
let points_and_distances = points_in_grid
.map(|point| (point.distance_to(&origin), point))
.collect::<Vec<(f64, Point)>>(); // compiles
游乐场链接
注意,如果您想保留订单:
.map(|(a, b)| (b, a))