let mut set = HashSet::<u32>::new();
let a = set.get(&1);
set.remove(&1);
a.unwrap(); // cannot borrow `set` as mutable because it is also borrowed as immutable
这是我的代码。我明白错误的含义以及为什么使用rust 会阻止我这样做。
但是我在 set.rs
中找不到任何类型注释来使该错误发生。
pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
where T: Borrow<Q>,
Q: Hash + Eq
这是 set.get
的声明,但我看不到任何相关内容。
最佳答案
重要部分get
是以下内容:-> Option<&T>
.
与您似乎相信的相反,此方法为您提供了一个引用,而不是实际的对象(并且这样做还建立了对项目的不可变借用)。结果,当你然后 remove()
说对象(并在集合中获得可变借用),引用显然立即失效,因此,你不可能 unwrap()
您可能正在寻找 take()
set 元素而不是 get()
.这将返回对象并从集合中删除项目,而不是返回引用;这也意味着您将不再需要调用 remove()
要么 ( playground ):
let mut set = HashSet::<u32>::new();
set.insert(1);
let a = set.take(&1).unwrap();
关于rust - 从 HashSet 获取时发生不可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351150/