繁体   English   中英

在 Rust 中为静态生命周期的悬空引用和建议而苦苦挣扎

[英]Struggling with dangling references and suggestions for static lifetimes in Rust

原谅我的新手 Rust-ing。 我写了一个函数来清理文件,并验证了该函数的逻辑似乎没问题。 然后我想将此函数从 main 重命名为辅助函数。 我知道我可以在主函数中保留一些 IO 的东西,但是为了好玩,假设我想在辅助函数中保留下面的所有代码。

如果我们将返回类型更改为Result<(), std::io::Error>并将最后一行修改为Ok(())则下面的代码将被编译。 然而,这段代码没有。 编译器建议我将&str修改为&'static str ,尽管这种更改似乎没有帮助,因为编译器然后说“E0277, main只能返回实现终止的类型”

在这一点上,我开始在对如何避免悬空引用的理解不足的情况下开始崩溃。

fn main() -> Result<Vec<&str>, std::io::Error> {
    let file = File::open("22names.txt")?;
    let mut buf_reader = BufReader::new(file);
    let mut contents = String::new();
    buf_reader.read_to_string(&mut contents)?;

    contents.retain(|c| c != '"');
    let v: Vec<&str> = contents.split(',').collect();

    println!("first 10 indices of v are: {:?}", &v[..10]);

    Ok(v)
}

编辑:如果我修改上面的内容,将 main 重命名为任意函数f ,并从一个新的 main 函数调用f并将结果分配给一个变量, let v = f()我得到以下错误,这是由于contents正在超出范围。 我如何将contents保持在范围内,或者更确切地说,是指向它的向量v 错误[E0515]:无法返回引用局部变量contents值,其中contentsv引用,我想返回的东西。

main 函数是程序的入口点。 由于这个函数是第一个被执行的函数,没有其他函数调用过它。 您的程序在 main 函数返回后退出。 main 函数的返回值用于确定程序的退出状态。 因此,没有其他函数可以使用main的返回值。 我建议重命名您的功能。

另一个错误发生是因为您返回字符串的切片。 Content包含您从文件中读取的数据,而v仅包含对这些数据的引用。 content超出范围后,内存将被释放。 这将导致v包含无效指针。 编译器不允许这样做。

您可以返回String而不是&str String拥有底层数据。 为此,您应该将函数签名更改为fn helper() -> Result<Vec<String>, std::io::Error> 您需要将您的Vec<&str>Vec<String> 你可以使用String::from那样:

let v: Vec<String> = contents.split(',').map(String::from).collect();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM