rust - 从 HashSet 获取时发生不可变借用

标签 rust lifetime

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/

相关文章:

xml - bsdtar文件分隔符字节?

rust - 闭包可能比当前函数长寿

pointers - () -> &str 函数的不可理解的行为

c++ - 引用临时与指向临时及其生命周期的指针

rust - 为什么不能在同一结构中存储值和对该值的引用?

c++ - 引用是否绑定(bind)到临时未定义行为的临时?

rust - tokio::spawn(my_future).await 和只是 my_future.await 有什么区别?

rust - 如何使用 'on_send'镍 react 的方法?

rust - 在没有生命周期参数的情况下限制类型实现生命周期的问题

rust - 使用装箱特征对象时,Rust 的生命周期规则是什么?