Rust 与悬而未决的参考文献和锈中静态寿命的建议作斗争

Rust 与悬而未决的参考文献和锈中静态寿命的建议作斗争,rust,reference,lifetime,dangling-pointer,Rust,Reference,Lifetime,Dangling Pointer,请原谅我的新手生锈。我编写了一个清理文件的函数,并验证了该函数的逻辑是否正常。然后我想把这个函数从main重命名为helper函数。我知道我可以在main函数中保留一些IO内容,但是为了好玩,假设我想在helper函数中保留下面的所有代码 如果我们将返回类型更改为Result,并修改最后一行以给出Ok(()),下面的代码将编译。Hovewer,这个代码没有。编译器建议我将&str修改为&'static str,尽管此更改似乎没有帮助,因为编译器接着说“E0277,main只能返回实现终止的类型”

请原谅我的新手生锈。我编写了一个清理文件的函数,并验证了该函数的逻辑是否正常。然后我想把这个函数从main重命名为helper函数。我知道我可以在main函数中保留一些IO内容,但是为了好玩,假设我想在helper函数中保留下面的所有代码

如果我们将返回类型更改为
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
中出现故障?从返回的内容有一些细微差别e> main特别是不适用于任何旧函数的。更新以反映问题。
v
是对
内容的引用,我想返回,但我不确定如何返回。假设我想将下面的所有代码保留在helper函数中——好的,但得到E0277的唯一原因是它不在helper函数中;您能否澄清,即使在
main
中出现故障,还是仅在
main
中出现问题?从
main
返回的内容有一些细微差别,特别是不适用于任何旧函数。更新以反映问题。
v
是对
内容的引用,而我想回去,但我不知道怎么回去。