Rust 从HashSet获取时发生不可变借用 let mut set=HashSet:::new(); 设a=set.get(&1); 设置。删除(&1); a、 展开();//无法将“set”作为可变项借用,因为它也是作为不可变项借用的

Rust 从HashSet获取时发生不可变借用 let mut set=HashSet:::new(); 设a=set.get(&1); 设置。删除(&1); a、 展开();//无法将“set”作为可变项借用,因为它也是作为不可变项借用的,rust,lifetime,Rust,Lifetime,这是我的密码。我明白了错误的含义以及为什么生锈会阻止我这么做。 但是我在set.rs中找不到任何类型注释来导致该错误 pub-fn-get(&self,value:&Q)->选项 其中T:借用, Q:Hash+Eq 这是set.get的声明,但我看不到任何相关内容。get的重要部分如下:->Option 与您似乎相信的相反,此方法为您提供了一个引用,而不是实际对象(这样做还建立了对项目的不可变借用)。因此,当您随后remove()所述对象(并获得对集合的可变借用)时,该引用显然立即无效,因此,

这是我的密码。我明白了错误的含义以及为什么生锈会阻止我这么做。 但是我在
set.rs
中找不到任何类型注释来导致该错误

pub-fn-get(&self,value:&Q)->选项
其中T:借用,
Q:Hash+Eq

这是
set.get
的声明,但我看不到任何相关内容。

get的重要部分如下:
->Option

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

您可能正在查看set元素的
take()
,而不是
get()
。这将返回对象并从集合中删除该项,而不是返回引用;这还意味着您将不再需要调用
remove()
或():

let mut set=HashSet:::new();
套。插入(1);
设a=set.take(&1).unwrap();

错误消息告诉
a
正在借用
set
。但是
选项
似乎并没有借用
设置
本身。
take
的类型签名不同之处在于
&mut self
@user3584499 Rust的所有权/借用系统没有调整以识别集合中的单个元素;因此,当获取对集合成员的引用时,也间接获取对集合本身的相同类型的引用。当你思考它时,它也是相当合乎逻辑的;它允许任何需要更精细调整约束的人通过内部可变性自行实现
let mut set = HashSet::<u32>::new();
set.insert(1);
let a = set.take(&1).unwrap();