Rust 与悬而未决的参考文献和锈中静态寿命的建议作斗争
请原谅我的新手生锈。我编写了一个清理文件的函数,并验证了该函数的逻辑是否正常。然后我想把这个函数从main重命名为helper函数。我知道我可以在main函数中保留一些IO内容,但是为了好玩,假设我想在helper函数中保留下面的所有代码 如果我们将返回类型更改为Rust 与悬而未决的参考文献和锈中静态寿命的建议作斗争,rust,reference,lifetime,dangling-pointer,Rust,Reference,Lifetime,Dangling Pointer,请原谅我的新手生锈。我编写了一个清理文件的函数,并验证了该函数的逻辑是否正常。然后我想把这个函数从main重命名为helper函数。我知道我可以在main函数中保留一些IO内容,但是为了好玩,假设我想在helper函数中保留下面的所有代码 如果我们将返回类型更改为Result,并修改最后一行以给出Ok(()),下面的代码将编译。Hovewer,这个代码没有。编译器建议我将&str修改为&'static str,尽管此更改似乎没有帮助,因为编译器接着说“E0277,main只能返回实现终止的类型”
Result
,并修改最后一行以给出Ok(())
,下面的代码将编译。Hovewer,这个代码没有。编译器建议我将&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)
}
fn main()->结果{
让file=file::open(“22names.txt”)?;
让mut buf_reader=BufReader::new(文件);
让mut contents=String::new();
buf_读取器。读取到字符串(&mut contents)?;
内容。保留(| c | c!=“”);
设v:Vec=contents.split(',').collect();
println!(“v的前10个指数是:{:?},&v[…10]);
好(五)
}
编辑:如果我修改上述内容,将main重命名为任意函数f
,并从新的main函数调用f
,并将结果分配给变量,let v=f()
我得到以下错误,这是由于内容
超出范围。我如何将内容
保持在范围内,或者更确切地说,是指向它的向量v
?
错误[E0515]:无法返回引用局部变量
contents
的值,其中contents
由v
引用,我要返回的内容。主函数是程序的入口点。由于此函数是第一个执行的函数,因此没有其他函数调用它。程序在主函数之后退出on已返回。main函数的返回值用于确定程序的退出状态。因此,没有其他函数可以使用main
的返回值。我建议重命名您的函数
发生另一个错误的原因是您返回了字符串的片段。Content
包含从文件读取的数据,而v
仅包含对此数据的引用。Content
超出范围后,内存被释放。这将导致v
包含无效指针。编译器将不允许在
您可以返回String
,而不是&str
String
拥有基础数据。为此,您应该将函数签名更改为fn helper()->Result
。您需要将Vec
转换为Vec
。您可以使用String::from
这样做:
让v:Vec=contents.split(',).map(String::from.collect();
主函数是程序的入口点。由于此函数是第一个执行的函数,因此没有其他函数调用它。程序在主函数返回后退出。主函数的返回值用于确定程序的退出状态。因此,没有其他函数可以使用re打开main
的值。我建议重命名函数
发生另一个错误的原因是您返回了字符串的片段。Content
包含从文件读取的数据,而v
仅包含对此数据的引用。Content
超出范围后,内存被释放。这将导致v
包含无效指针。编译器将不允许在
您可以返回String
,而不是&str
String
拥有基础数据。为此,您应该将函数签名更改为fn helper()->Result
。您需要将Vec
转换为Vec
。您可以使用String::from
这样做:
让v:Vec=contents.split(',).map(String::from.collect();
假设我想将下面的所有代码都保留在helper函数中——好的,但是您得到E0277的唯一原因是因为它不在helper函数中;您能否澄清一下,即使在main
中出现故障,还是仅在main
中出现故障?从v
是对内容的引用,我想返回,但我不确定如何返回。假设我想将下面的所有代码保留在helper函数中——好的,但得到E0277的唯一原因是它不在helper函数中;您能否澄清,即使在main
中出现故障,还是仅在main
中出现问题?从main
返回的内容有一些细微差别,特别是不适用于任何旧函数。更新以反映问题。v
是对内容的引用,而我想回去,但我不知道怎么回去。