【问题标题】:immutable borrow occurs when get from HashSet从 HashSet 获取时发生不可变借用
【发布时间】:2019-10-12 05:28:20
【问题描述】:
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 的声明,但我看不到任何相关内容。

【问题讨论】:

    标签: rust lifetime


    【解决方案1】:

    get 的重要部分如下:-&gt; Option&lt;&amp;T&gt;

    与您似乎相信的相反,此方法为您提供了一个引用,而不是实际的对象(这样做也会在项目上建立一个不可变的借用)。结果,当您然后remove() 说对象(并获得对集合的可变借用)时,引用显然立即无效,因此您不可能unwrap() 它。

    您可能正在寻找take() set 元素而不是get()。这将返回对象并从集合中删除项目,而不是返回引用;这也意味着您将不再需要致电remove() (playground):

    let mut set = HashSet::<u32>::new();
    set.insert(1);
    let a = set.take(&1).unwrap();
    

    【讨论】:

    • 错误信息告诉a正在借用set。但是Option&lt;&amp;T&gt; 本身似乎并没有借用settake 的类型签名与 &amp;mut self 不同。
    • @user3584499 Rust 的所有权/借用系统没有针对识别集合中的单个元素进行调整;因此,当您获得对集合成员的引用时,您也会间接获得对集合本身的相同类型的引用。当您考虑它时,这也很合乎逻辑。它允许任何需要更微调约束的人通过内部可变性自己实现它
    猜你喜欢
    • 2022-11-26
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2020-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多