[英]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
值,其中contents
由v
引用,我想返回的东西。
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.