gpt4 book ai didi

generics - 可变借位在循环的上一迭代中从此处开始

转载 作者:行者123 更新时间:2023-12-03 11:34:42 24 4
gpt4 key购买 nike

在这里,Rust新手,我在StackOverflow中寻找了类似的案例(并且有很多案例),但是它们的场景都稍有不同,因此我想不出办法来解决此问题。
我试图遍历一些字符串,将它们传递给对它们进行一些操作的函数,最后将结果插入向量中。 (对于map场景,实际情况太复杂了)。
playground

mod lifetime_test {
fn parse_line<'a>(item: &'a str, target: &'a mut Vec<&'a str>) {
// ... use item to compute a result
target.push("result");
}

fn parse_file() {
let mut target: Vec<&str> = Vec::new();
let source: Vec<&str> = Vec::new();

// ... fill source with strings from file

for item in source {
parse_line(item, &mut target);
}
}
}

fn main() {}
上面的代码无法编译: mutable borrow starts here in previous iteration of loop调用中的 parse_line
我想我理解为什么它提示多重可变借位,但是我找不到找到传递字符串和向量的方法,并让 parse_line函数将其结果存储到传递的向量中。
在实际情况下, parse_line函数很复杂,它可能会或可能不会将值添加到几个向量中,因此我认为使 parse_line返回多个值会使理解起来更加复杂。因此,我宁愿传递vector(2)并让 parse_line决定是否需要或不需要为其添加新值。

最佳答案

改变:

fn parse_line<'a>(item: &'a str, target: &'a mut Vec<&'a str>)
到:
fn parse_line<'a>(item: &'a str, target: &mut Vec<&'a str>)
仅仅因为您有一个在整个生存期中都是通用的 'a函数,但这并不意味着该函数使用的每个引用都必须具有 'a生存期。可变的 target借用的生存期必须短于或等于 'a,但是您不希望它相等,因为它会严重限制您的代码(并且完全是不必要的),因此,只要删除 'atarget的可变借位批注中,编译器推断出可变借位的适当生存期,然后代码进行编译:
fn parse_line<'a>(item: &'a str, target: &mut Vec<&'a str>) {
// ... use item to compute a result
target.push("result");
}

fn parse_file() {
let mut target: Vec<&str> = Vec::new();
let source: Vec<&str> = Vec::new();

// ... fill source with strings from file

for item in source {
parse_line(item, &mut target);
}
}
playground

关于generics - 可变借位在循环的上一迭代中从此处开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66162422/

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