我正在尝试编写一个函数,该函数查找并返回Vec中现有元素的可变引用,如果不存在则插入它并返回新元素的可变引用。
我已经尝试了几次,但是借用检查器并不信服。我已将我尝试编写的代码简化为下面的示例,该示例给出了相同的错误。
我已经尝试了几次,但是借用检查器并不信服。我已将我尝试编写的代码简化为下面的示例,该示例给出了相同的错误。
fn mut_find_or_insert<T: PartialEq>(vec: &mut Vec<T>, val: T) -> &mut T {
if let Some(u) = vec.iter_mut().find(|u| **u == val) {
u
} else {
vec.push(val);
vec.last_mut().unwrap()
}
}
Rust 给我以下编译器错误(通过游乐场链接查看完整信息):
error[E0499]: cannot borrow `*vec` as mutable more than once at a time
这似乎是可以在Rust中实现的东西,但我不清楚如何重新实现它以避免借用检查器错误。
HashSet
内部包含一个HashMap
,因此get_or_insert()
操作的是键来检索,而不是整个集合。这是关键区别,也是我的(可行的)代码片段所说明的 - 由于生命周期的工作方式,你被迫将步骤分为两个部分,无论是在不同的结构体中还是像我一样,在不同的路径中。首先,你进行编辑,然后再返回。 - Sébastien Renauldget_or_insert
将无法返回可变引用,因为您不允许以使哈希无效的方式修改HashMap中的条目。这是否只留下了使用Vec
将插入与返回分开的选项? - Chris Pearce