【发布时间】:2016-03-20 19:38:58
【问题描述】:
我正在努力完成这项工作
use std::collections::HashMap;
struct Test1 {
total: u32,
hash: HashMap<u32, u32>,
}
impl Test1 {
fn new() -> Test1 {
Test1 {
total: 0,
hash: HashMap::new(),
}
}
fn add(&mut self) -> u32 {
self.total += 1;
self.total
}
fn get_or_create(&mut self, id: u32) -> u32 {
match self.hash.get(&id) {
Some(value) => *value,
None => {
let value = self.add();
self.hash.insert(id, value);
value
}
}
}
}
fn main() {
let mut test = Test1::new();
println!("{:?}", test.get_or_create(1));
println!("{:?}", test.get_or_create(1));
}
(游戏笔)[http://is.gd/hDLEaL]
但我明白了
<anon>:25:33: 25:37 error: cannot borrow `*self` as mutable because `self.hash` is also borrowed as immutable [E0502]
删除模式匹配并不能解决问题,但我不明白为什么。
【问题讨论】:
-
尝试将
match self.hash.get(&id) {改成match self.hash.get(&id).cloned() {和*value改成value -
谢谢,很有意义。它有效!
-
那是因为
get返回Option<&u32>但您实际上不需要借用的引用,而只需要值。所以cloned()将Option<&T>转换为Option<T>并释放借用。 -
对于你想做的事情,有一个更好的成语,
.entry().or_insert():doc.rust-lang.org/std/collections/hash_map/…
标签: rust