gpt4 book ai didi

memory-management - 生命周期不够长使用rust

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

我想打开一个文件,替换一些字符,并进行一些拆分。然后我想返回字符串列表。但是我得到了error: broken does not live long enough。我的代码在 main 中时有效,所以这只是生命周期的问题。

fn tokenize<'r>(fp: &'r str) -> Vec<&'r str> {
let data = match File::open(&Path::new(fp)).read_to_string(){
Ok(n) => n,
Err(e) => fail!("couldn't read file: {}", e.desc)
};
let broken = data.replace("'", " ' ").replace("\"", " \" ").replace(" ", " ");
let mut tokens = vec![];

for t in broken.as_slice().split_str(" ").filter(|&x| *x != "\n"){
tokens.push(t)
}
return tokens;
}

如何使此函数返回的值存在于调用者的范围内?

最佳答案

问题是您的函数签名说“结果与输入具有相同的生命周期 fp”,但事实并非如此。结果包含对 data 的引用,这是在你的函数内部分配的;它与fp无关!就目前而言,data将在您的函数结束时不复存在。

因为您正在有效地创建新值,所以您不能返回引用;您需要将该数据的所有权移出该函数。我想到了两种方法来做到这一点:

  1. 而不是返回 Vec<&str> , 返回 Vec<String> ,其中每个标记都是新分配的字符串。

  2. 返回data在实现拆分逻辑的包装器类型中。然后,你可以有 fn get_tokens(&self) -> Vec<&str> ;切片的生命周期可以与包含 data 的对象的生命周期相关联.

关于memory-management - 生命周期不够长使用rust ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065655/

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