ある単語を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()
、if としてチェックを実行する必要があり、次にSome
.