一生不够生锈

时间:2014-11-21 16:10:51

标签: memory-management rust lifetime

我想打开一个文件,替换一些字符,并进行一些拆分。然后我想返回字符串列表。但我得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;
} 

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

1 个答案:

答案 0 :(得分:3)

问题是你的功能签名是&#34;结果与输入fp&#34;的寿命相同,但这根本不是真的。结果包含对data的引用,它在函数内部分配;它与fp无关!按照目前的情况,data将在你的功能结束时停止存在。

因为您有效地创建新值,所以您无法返回引用;您需要将该数据的所有权转移出该功能。我可以通过两种方式来做到这一点,从头到尾:

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

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