假设我有两个HashMap
,m1
和m2
,它们具有相同的非Copy
密钥集,只是m2
的密钥是从m1
借用的(说,m1
具有String
密钥,m2
具有从m1
借用的&str
密钥).是否可以遍历m1
并使用m2
中的相应值更新其值?编译器认为,由于m2
借用了(不可变地)从m1
借用m1
(比如说,通过iter_mut()
或get_mut()
)是不允许的。
下面是一个MVE,演示了两种迭代尝试:
use std::collections::HashMap;
fn main() {
let mut m1 = HashMap::<_, _>::from_iter([("a".to_owned(), 1), ("b".to_owned(), 2)]);
let m2 = m1
.iter()
.map(|(k, v)| (k.as_str(), v))
.collect::<HashMap<_, _>>();
for (k, v) in m1.iter_mut() {
*v += m2[k.as_str()];
}
for (&k, &v) in m2.iter() {
*m1.get_mut(k).unwrap() += v;
}
}
个字符
我相信我尝试做的是合理的,因为修改HashMap
的现有值不会导致它的任何键移动,所以m2
对m1
的键的引用将保持有效。
我曾经考虑过使用Rc<String>
键或者仅仅使用usize
并将String
存储在Vec
中,但是我想知道是否有更简单的方法。
1条答案
按热度按时间5f0d552i1#
一般来说,编译器不允许
&mut
访问m1
,因为你可以调用.clear()
并销毁m2
所借用的值。对我来说,使用
Rc
作为键似乎是一个明智的解决方案。另一个可以考虑的选择是对
m1
的值使用内部可变性类型(Cell
或RefCell
),这将允许您在&mut
不访问m1
的情况下改变它们。由于值是数字,Cell
可能是一个很好的选择,因为它没有RefCell
那样的引用计数开销。