Rust中如何从HashSet弹出随机值 现有编译报错代码如何重写
错误原因
你原来的写法违反了Rust的借用规则:
my_set.iter()会对my_set产生不可变借用,这个借用的生命周期会持续到整个map调用结束map闭包里的my_set.take()需要对my_set产生可变借用
Rust不允许同一时间同时存在对同一个对象的不可变借用和可变借用,因此编译报错。
修复方案
最简单的修复方式是先把取到的元素引用克隆一份,提前结束iter()产生的不可变借用,再调用take方法:
// 写法1:分支判断形式,方便后续处理 if let Some(elem) = my_set.iter().next().cloned() { let popped_val = my_set.take(&elem).unwrap(); // 对弹出的值做后续处理 } // 写法2:函数式链式调用,直接返回Option<T> let popped_val = my_set.iter().next().cloned().and_then(|elem| my_set.take(&elem));
如果HashSet存储的元素实现了Copy trait,可以把cloned()替换为copied(),能获得更好的性能。
如果不想做元素克隆,也可以用以下unsafe写法(不推荐,除非性能要求极高,且能确定指针安全):
let elem = my_set.iter().next().map(|v| v as *const _); let popped_val = elem.and_then(|p| unsafe { my_set.take(&*p) });
内容的提问来源于stack exchange,提问作者Maan
相关产品推荐
相关产品推荐

