rust - 从 HashSet 中删除任何元素并获得所有权(随机顺序很好)

标签 rust hashset ownership remove

如何从 Rust 中的 HashSet 中删除元素并获得它的所有权?我知道选择的元素会有一个伪随机顺序,这很好。
目前,我是这样做的:

use std::collections::HashSet;

fn main() {
   let mut items = HashSet::new();
   items.insert("foo".to_string());
   items.insert("bar".to_string());
   items.insert("baz".to_string());

   let item = items.iter().next().unwrap().clone();
   items.remove(&item);
}
Playground Link
有没有办法在最后摆脱 .clone() ?问题的关键是 HashSet::remove 不返回一个拥有的删除值,而是一个 bool
编辑 :我忘了提及(如果不够明显的话),之后我需要访问拥有的值(value)。
编辑 2 :我不能使用 take ,因为要使用它,我需要获得一个我还不知道的值!我认为 this playground 更清楚地说明了我的意思。 (它甚至不编译)

最佳答案

您可以使用其他容器,例如 Vec 吗?有一个内置函数 pop() 可以满足您的要求。如果您想要唯一值,则不必坚持使用 HashSet
将所有值插入 HashSet 后,您可以将其转换为 Vec ,然后执行您想要的操作。弹出该值,您拥有它,其余的向量仍然存在。如果您愿意,可以在完成所有操作后将 Vec 转换回 HashSet
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=705bf09cad3b6940c2a7ab0b19bbf78f
如果你必须到处使用 HashSet ,我认为你将不得不使用 into_iter() 来消费它,获取你的值,并将迭代器转换回 HashSet ,我认为这种方式效率不高。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e7295e7ea720994d1ab8d199ebd23a8d

关于rust - 从 HashSet 中删除任何元素并获得所有权(随机顺序很好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63759800/

相关文章:

rust - 在 for 循环中从 DirEntry 获取文件信息

c# - 从 .NET HashSet 按索引选择元素

java - 如何在与Equal和hashcode一致的情况下实现compareTo()方法

c++ - 可以在运行时更改所有权的智能指针 (C++)

rust - 从文件反序列化Toml时出现无用的错误

rust - 我可以隐瞒这些生命中的任何一个吗?

rust - `cannot infer an appropriate lifetime for autoref due to conflicting requirements` 但由于 trait 定义限制,不能改变任何东西

java - 查找部分重复值并保留特定值

rust - 有没有办法从另一个向量中存在的通用第一个向量中删除条目?

rust - Rust-从 `&str`转换为 `String`,然后使用闭包转换