Rust代码出现cannot return value referencing temporary value错误原因排查
错误原因分析与解决方案
核心错误原因
你的函数签名声明返回Result<Option<&'static OsStr>, Box<dyn Error>>,问题出在:
env::current_exe()返回的PathBuf是函数内的临时值,函数执行结束后会被Rust所有权系统销毁。file_name()方法返回的Option<&OsStr>是对这个临时PathBuf内部数据的引用,当临时PathBuf被销毁时,这个引用就成了悬空引用。Rust的借用检查器会直接阻止这种不安全行为,也就是你看到的E0515错误。
你尝试的代码为什么没用
你用to_owned()或clone()克隆了PathBuf,但克隆出来的依然是函数内的临时对象,file_name()返回的引用还是绑定到这个临时对象上。函数结束时临时对象依然会被销毁,引用还是无法安全返回。
正确的解决方式
既然不能返回临时对象的引用,那就返回拥有所有权的类型。把函数签名里的&'static OsStr换成OsString(OsStr的所有权版本),然后将file_name()的结果转换为拥有所有权的形式:
use std::env; use std::error::Error; use std::ffi::OsString; fn exe_name() -> Result<Option<OsString>, Box<dyn Error>> { // 两种写法任选其一 Ok(env::current_exe()?.file_name().map(|s| s.to_owned())) // Ok(env::current_exe()?.file_name().cloned()) }
修改后,OsString会获得文件名的所有权,能安全返回并在函数外部使用,完全符合Rust的所有权规则。
内容的提问来源于stack exchange,提问作者manungsa
相关产品推荐
相关产品推荐

