rust - "Popping"来自 HashSet 的值

标签 rust hashset borrow-checker

我似乎找不到从 HashSet 中弹出(随机)值的方法.受其他代码示例的启发,我写了以下内容:

my_set.iter().next().map(|i| my_set.take(i).unwrap())
即获取集合值的迭代器,从中获取第一个值(引用),然后运行 ​​my_set.take()使用先前获得的引用,获取值本身(而不是引用)并将其从集合中删除。
由于以下原因无法编译:
error[E0500]: closure requires unique access to `my_set` but it is already borrowed
   |
32 |         my_set.iter().next().map(|i| my_set.take(i).unwrap())
   |         ------               --- ^^^ ------ second borrow occurs due to use of `my_set` in closure
   |         |                    |   |
   |         |                    |   closure construction occurs here
   |         |                    first borrow later used by call
   |         borrow occurs here
我已经尝试了很多很多变种,但它们都失败了,因为不可变的借用然后被借用为可变的(错误 502)。
任何人都可以推荐一种重写上述内容的方法吗?

最佳答案

如果您可以克隆删除的项目,您可以执行以下操作:

let elem = set.iter().next().unwrap().clone();
set.remove(&elem);
Playground
或者防止集合为空:
if let Some(elem) = set.iter().next().cloned() {
    set.remove(&elem);
}
Playground

关于rust - "Popping"来自 HashSet 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68825244/

相关文章:

rust - 请求消息值必须在静态生命周期内有效

string - 无法使用 if 表达式附加到字符串而不是 if 语句

vector - 如何将字符串的 HashSet 转换为向量?

time - Rust中的基准测试程序

vector - 如何最好地保留Vec中的前N个元素并释放未使用的容量?

c++ - 如何在C++中正确使用hash_set

overloading - 在 Perl 6 中使用自定义散列函数设置/散列

rust - 从 HashMap 或 Vec 返回引用会导致借用持续超出其所在的范围吗?

arrays - 如何将 iter.next() 转换为数组索引?

java - Map[] myArr,每个都有 <K>Integer、<V>HashSet ...无法获取 HashSet (Java)