gpt4 book ai didi

rust - 在匹配语句和结果中可变借用

转载 作者:行者123 更新时间:2023-11-29 08:07:38 25 4
gpt4 key购买 nike

我试图确定一个容器是否有一个对象,如果有则返回找到的对象,如果没有则添加它。

我找到了 Rust borrow mutable self inside match expression它有一个答案,说明我正在尝试做的事情不能(不能?)完成。

在我的情况下,我有一些对象具有子向量。我不想暴露对象的内部结构,因为我可能想更改下面的表示。

How can you resolve the need to mutably borrow in different match arms in Rust?似乎暗示如果我得到正确的生命周期,我可以做我想做的事,但我一直无法弄清楚如何做。

这是我遇到的问题的表示形式:

fn find_val<'a>(container: &'a mut Vec<i32>, to_find: i32) -> Option<&'a mut i32> {
for item in container.iter_mut() {
if *item == to_find {
return Some(item);
}
}

None
}

fn main() {
let mut container = Vec::<i32>::new();
container.push(1);
container.push(2);
container.push(3);

let to_find = 4;

match find_val(&mut container, to_find) {
Some(x) => {
println!("Found {}", x);
}
_ => {
container.push(to_find);
println!("Added {}", to_find);
}
}
}

playground

我得到的错误是:

error[E0499]: cannot borrow `container` as mutable more than once at a time
--> src/main.rs:24:13
|
19 | match find_val(&mut container, to_find) {
| --------- first mutable borrow occurs here
...
24 | container.push(to_find);
| ^^^^^^^^^ second mutable borrow occurs here
...
27 | }
| - first borrow ends here

最佳答案

将变化放在函数中,并使用提前返回而不是 else 分支:

fn find_val_or_insert(container: &mut Vec<i32>, to_find: i32) {
if let Some(x) = find_val(&container, to_find) {
println!("Found {}", x);
return; // <- return here instead of an else branch
}
container.push(to_find);
println!("Added {}", to_find);
}

另见 Mutable borrow more than onceHow to update-or-insert on a Vec?

关于rust - 在匹配语句和结果中可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49247879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com