gpt4 book ai didi

rust - 想要使用模式匹配添加到 HashMap,一次多次借用可变的

转载 作者:行者123 更新时间:2023-11-29 07:41:47 25 4
gpt4 key购买 nike

我正在尝试编写一些玩具代码,用于存储它在 HashMap 中看到某个单词的次数。如果键存在,它会将计数器加 1,如果键不存在,它会将值 1 添加。我本能地想通过模式匹配来做到这一点,但我不止一次遇到了借用可变错误:

fn read_file(name: &str) -> io::Result<HashMap<String, i32>> {
let b = BufReader::new(File::open(name)?);
let mut c = HashMap::new();

for line in b.lines() {
let line = line?;
for word in line.split(" ") {
match c.get_mut(word) {
Some(i) => {
*i += 1;
},
None => {
c.insert(word.to_string(), 1);
}
}
}
}

Ok(c)
}

我得到的错误是:

error[E0499]: cannot borrow `c` as mutable more than once at a time
--> <anon>:21:21
|
16 | match c.get_mut(word) {
| - first mutable borrow occurs here
...
21 | c.insert(word.to_string(), 1);
| ^ second mutable borrow occurs here
22 | }
23 | }
| - first borrow ends here

我理解为什么编译器脾气暴躁:我已经告诉它我要改变键入 word 的值,但是插入不在那个值上。但是,插入是在 None 上进行的,所以我认为编译器可能已经意识到现在没有机会改变 c[s]

我觉得这个方法应该有效,但我错过了一个窍门。我做错了什么?

编辑:我意识到我可以使用

        if c.contains_key(word) {
if let Some(i) = c.get_mut(s) {
*i += 1;
}
} else {
c.insert(word.to_string(), 1);
}

但这看起来非常丑陋的代码与模式匹配(特别是必须执行 contains_key() 检查,然后使用 Some 再次进行检查.

最佳答案

您必须使用条目“模式”:

use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};

fn main() {
let mut words = vec!["word1".to_string(), "word2".to_string(), "word1".to_string(), "word3".to_string()];
let mut wordCount = HashMap::<String, u32>::new();

for w in words {
let val = match wordCount.entry(w) {
Vacant(entry) => entry.insert(0),
Occupied(entry) => entry.into_mut(),
};

// do stuff with the value
*val += 1;
}

for k in wordCount.iter() {
println!("{:?}", k);
}
}

Entry 对象允许您在缺少值时插入值,或者在值已存在时修改它。

https://doc.rust-lang.org/stable/std/collections/hash_map/enum.Entry.html

关于rust - 想要使用模式匹配添加到 HashMap,一次多次借用可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30851464/

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