【发布时间】:2018-07-17 15:37:59
【问题描述】:
我想使用.iter_mut() 和.map() 遍历一个向量:
fn calculate_distances(planes : &mut Vec<Aeroplane>, x: f64, y: f64) {
fn calculate_distance(x1: &f64, y1: &f64, x2: &f64, y2: &f64) -> f6 { ... }
planes.iter_mut().map(|a| if a.position.is_some() {
let pos: &Position = &a.position.unwrap();
a.distance = Some(calculate_distance(&x, &y, &pos.latitude, &pos.longitude));
});
}
Aeroplane 包含我的 Position 结构的实例:
struct Position {
latitude: f64,
longitude: f64,
}
据我了解,我只是借用位置信息,没有搬出任何东西,但借用检查器拒绝了我的代码:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:145:31
|
4 | let pos: &Position = &a.position.unwrap();
| ^ cannot move out of borrowed content
我的错误在哪里?
【问题讨论】:
-
unwrap调用会将数据从您借用的Option中移出。您应该插入一个Option::as_ref,这会将&Option<T>转换为Option<&T>,这样您就可以打开选项并仍然只是借用数据。 doc.rust-lang.org/std/option/enum.Option.html#method.as_ref