如何从 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/