在rust中为HashMap获取两个可变引用



我正在尝试开始使用Rust,并想知道如何将下面的一段c++代码转换为Rust。

考虑一下这个C++代码:

void func(int c) {
unordered_map<int, int> map;
auto& a = map[10];
auto& b = map[20];
// some complex logic
if (c > 10) {
a += 1;
b += 1;
} else {
a += 2;
b += 2;
}
cout << map[10] << " " << map[20] << 'n';
}

现在,我已经用一个简单的if/else替换了some complex logic,但本质上,我需要两个对哈希映射中两个值的可变引用。

考虑相应的锈蚀代码:

fn func(c: i32) {
let mut map = HashMap::new();
let a = map.entry(&10).or_insert(0);
let b = map.entry(&20).or_insert(0);
// some complex code here
if c > 10 {
*a += 1;
*b += 1;
} else {
*a += 2;
*b += 2;
}
}

rustc不会编译此代码,因为我有两个可变引用要映射到这里。

一个人应该如何在铁锈中做这件事?

您可以尝试使用内部可变模式来实现此目标,您的代码将更改为类似的内容。

use std::collections::HashMap;
use std::cell::Cell;
fn func(c: i32) {
let mut map = HashMap::new();
map.insert(10, Cell::new(0));
map.insert(20, Cell::new(0));

let a = map.get(&10).unwrap();
let b = map.get(&20).unwrap();
// some complex code here
if c > 10 {
a.set(a.get() + 1);
b.set(b.get() + 1);
} else {
a.set(a.get() + 2);
b.set(b.get() + 2);
}
}

游乐场链接

最新更新