我的Rust代码有“无法返回引用临时值的值”错误,为什么在哪里?

i34xakig  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(154)

注意:我对Rust还是个新手
我创建了一个函数来获取当前exe的文件名(而不是完整路径)。

fn exe_name() -> Result<Option<&'static OsStr>, Box<dyn Error>> {
    Ok(env::current_exe()?.file_name())
}

但代码无法编译:

$ cargo clippy
...
error[E0515]: cannot return value referencing temporary value
 --> src/libs.rs:8:5
  |
8 |     Ok(env::current_exe()?.file_name())
  |     ^^^-------------------^^^^^^^^^^^^^
  |     |  |
  |     |  temporary value created here
  |     returns a value referencing data owned by the current function

For more information about this error, try `rustc --explain E0515`.
...

我已经检查了rustc --explain E0515并在互联网上搜索(以及StackOverflow),所以基本上我不能返回对本地var的引用,因为它会在函数结束时被销毁。尽管如此,我还是不知道我的代码中有问题的部分在哪里.你能解释一下吗?
我试过这个代码,但仍然不起作用:

Ok(env::current_exe()?.to_owned().file_name())
Ok(env::current_exe()?.clone().file_name())
fnvucqvd

fnvucqvd1#

这个错误是因为current_exe返回PathBuf,它是一个owned value
当在PathBuf上调用file_name时,它会引用存储在PathBuf中的一段路径。因此,当函数返回时,引用不再引用任何东西所拥有的数据。
它相当于

fn example() -> &str {
    let s = String::new("hello");
    &s
}

你已经注意到,你的函数的返回值需要某种生命周期,你设置为static,这意味着程序的整个长度,这是不正确的。 那么从file_name返回的生命周期实际上是指?在本例中,生存期是由exe_name函数返回的,因此无法返回。 要使函数正常工作,需要将file_name的结果设置为拥有值,而不是current_exe`。

fn exe_name() -> Result<Option<OsString>, Box<dyn Error>> {
    Ok(env::current_exe()?.file_name().map(|name| name.to_owned()))
}

相关问题