gpt4 book ai didi

rust - 延长 'for' 变量的生命周期

转载 作者:行者123 更新时间:2023-11-29 08:33:23 26 4
gpt4 key购买 nike

当我在 Rust 0.12.0 中编译以下代码时,出现以下错误:

error: borrowed value does not live long enough
let _ = match re.captures(a_line.unwrap().as_slice()) {

如何延长 a_line 的生命周期,以便可以将 c1 推到 vect1 上?

let vect = process_file(filename_ref);
...
fn process_file(filename: &str) -> Vec<&str> {

let re = regex!(r"^(\w+)\t(\w+)\t(\w+)\t(\w+)\n$");
let mut vect1 = Vec::new();

let filepath = Path::new(filename);
let _ = match File::open(&filepath) {
Ok(f) => {
let mut filebuffer = BufferedReader::new(f);
for a_line in filebuffer.lines() {
let _ = match re.captures(a_line.unwrap().as_slice()) {
Some(c) => {
let c1 = c.at(1);
vect1.push(c1);
...
},
...
};
} // end for
},
Err(e) => println!("Error: {}", e)
};

return vect1;

}

最佳答案

简短的回答是,不,你不能像这样“延长”变量的生命周期。

这是一个连接类型的游戏:

  • .lines 返回 Lines 实例,这是一个 Iterator<IoResult<String>> .
  • a_line是一个 IoResult <String> = Result<String, IoError> ,等等 .unwrap 返回 String
  • .as_slice 通过 'a 给出字符串数据的非拥有 View 引用的生命周期,静态限制为仅在 String 时可用存在避免悬垂引用和 C++ 中释放后使用的问题(有关 String&str 的更多信息:this answerthe strings guide)。
  • .captures 需要 &str有一段时间( 't )并尝试返回 Captures 持续那么久。在这种情况下,&str 的生命周期是 String 的生命周期来自 a_line ,等等 cCaptures存储仅在这段时间内有效的数据。
  • .at 返回 &str't Captures 数据的生命周期正在存储,即返回的&str仅保证与原装 &str 一样长送入 captures (不能超过原始 String 存在的时间,因为这是在管理内存中的文本)

因此,c1只持续到 String来自 a_line ,那String作用域在循环内,也就是说,每次你单步执行循环时,你都会得到一个新的 String最后被释放。如果编译器通过允许将其放置在 vect1 中让它转义,代码很容易出现释放后使用/悬空引用内存安全错误,如 String每个&str points into 在每次迭代结束时被释放(例如 &str 行上的 vect1 中的所有 return vect1 将指向垃圾)。

要解决此问题,您需要削减内存依赖性:目前是 &str s 无法控制自己的内存,因此依赖于“父”String正确放置。相反,您可以让矢量内容控制自己的命运(好吧,内存),方法是使它们完全成熟 String s,例如vect1.push(c1.to_string()) .这将使 vect1一个Vec<String> ,然后这些值与 a_line 之间不再有联系循环内的值。然后可以在不影响 vect1 的内容的情况下尽可能多地释放/破坏/修改该变量。 .

关于rust - 延长 'for' 变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40981225/

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