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

标签 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;
} 

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

最佳答案

问题是您的函数签名说“结果与输入具有相同的生命周期 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/

相关文章:

multidimensional-array - Rust 中的多维向量,段错误?

rust - Rust是否会缩小生命周期以满足对其定义的约束?

c++ - 由于堆分配/解除分配导致堆栈溢出

java - 查找分配给进程的虚拟内存量

rust - 为什么这个 Rust 比我类似的 Python 慢?

rust - 一次不能多次借用 `x` 作为可变的吗?

rust - 尝试为结构设置带有生存期的返回值时,由于需求冲突,因此无法为autoref推断适当的生存期

c - 为什么32bit的内存只需要1bit的map

c - 分配一个大块而不是许多小块?

rust - 将结构向量转换为另一个结构向量的惯用方式是什么