我想打开一个文件,替换一些字符,并进行一些拆分。然后我想返回字符串列表。但我得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;
}
如何使此函数返回的值存在于调用者的范围内?
答案 0 :(得分:3)
问题是你的功能签名是&#34;结果与输入fp
&#34;的寿命相同,但这根本不是真的。结果包含对data
的引用,它在函数内部分配;它与fp
无关!按照目前的情况,data
将在你的功能结束时停止存在。
因为您有效地创建新值,所以您无法返回引用;您需要将该数据的所有权转移出该功能。我可以通过两种方式来做到这一点,从头到尾:
不是返回Vec<&str>
,而是返回Vec<String>
,其中每个标记都是新分配的字符串。
在实现拆分逻辑的包装器类型中返回data
。然后,你可以拥有fn get_tokens(&self) -> Vec<&str>
;切片的生命周期可以与包含data
的对象的生命周期联系起来。