gpt4 book ai didi

rust - 借用 HashMap 而不借用他的内容

转载 作者:行者123 更新时间:2023-12-03 11:43:10 24 4
gpt4 key购买 nike

我是新手,我已经阅读了有关所有权和借用的文档。显然,我开始为这个概念而苦苦挣扎...

这是我的代码:


#[derive(Serialize, Deserialize, Debug)]
pub struct City {
name: String,
dep: String,
dynamic: String,
population: u64,
cp: String,
price_max: u8,
price_mid: u8,
price_min: u8,
lng: f64,
lat: f64,
dist_near_city: Vec<(String, u64)>
}

fn load_cities<P: AsRef<Path>>(path: P) -> HashMap<String, City> {
// Open the file in read-only mode with buffer.
let file = File::open(path).expect("Unable to open file");
let reader = BufReader::new(file);
let retval: HashMap<String, City> = serde_json::from_reader(reader).expect("Unable to parse json");

return retval;
}

fn update_nearby_cities(pin_city: &mut City, cities : &HashMap<String, City>, min_pop: u64, distKm: f64){
pin_city.dist_near_city = Vec::new();
for (id, city) in cities {
if city.population > min_pop && is_nearby(&pin_city, &city, distKm){
pin_city.dist_near_city.push((id.to_string(), city.population));
}
}
}


fn main(){
let path = "/home/marcel/Documents/immobilier/cities_export2.json";
let mut cities = load_cities(path);

for (cp, mut current_city) in &cities {
update_nearby_cities(&mut current_city, &cities, 2000, 10.);
}
}

我在main()循环中收到arg &mut current_city的错误:
cannot borrow data in areference as mutable
首先,我不明白为什么我不能借用可变的引用,因为在我的代码的其他部分和文档( https://doc.rust-lang.org/rust-by-example/scope/borrow/mut.html)中都有可能

我认为这是因为 &cities上的循环为我提供了 current_city: &City,并且通过提供 &mut current_city我传递了一个 &mut &City,这是一个问题(我不知道如何处理这种类型,我什至不认为我理解这是什么。 ..)。

因此,如果我尝试仅传递 mut current_city,我会得到 Exepted expression

我预见到的另一个问题是,我试图在循环中借用hashmap cite,然后在循环内重新借用它。

怎样正确地做这种事情,我对错误的看法是否正确?

最佳答案

for entry in &cities给出了对(&K,&V)的迭代器。如果您需要对(&K,&mut V)进行迭代的迭代器,请使用`&mut city'

Even with this change code will not work. You are trying to iterate & modify cities at the same time.



一种无需进行大量重构的简单方法是一次计算所有结果,然后将它们稍后添加到哈希图中。
fn get_nearby_cities(pin_city: &City, cities : &HashMap<String, City>, min_pop: u64, distKm: f64) -> Vec<(String, u64)> {
let mut dist_near_city = Vec::new();
for (id, city) in cities {
if city.population > min_pop && is_nearby(&pin_city, &city, distKm){
dist_near_city.push((id.to_string(), city.population));
}
}

dist_near_city
}


# Compute all the required results. Unfortunately, I ended up clone the string. May be this could be avoided.
let mut result = HashMap::new();
for (cp, current_city) in &cities {
result.insert(cp.clone(), get_nearby_cities(current_city, &cities, 2000, 10.));
}

for (city, nearby_cities) in result {
cities.get_mut(&city).unwrap().dist_near_city.extend(nearby_cities);
}

关于rust - 借用 HashMap 而不借用他的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62129743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com