我最近一直在使用rust,发现std::option::Option
类型在变量的生命周期范围界定方面有些令人困惑。我是该语言的新手,所以很抱歉解决此问题。我一直在尝试从Some
的选项匹配模式中提取基础值,如下所示:
let filename = match canonicalize(&PathBuf::from(filename)).unwrap().to_str() {
Some(path) => path,
_ => "",
};
// Later, I validate the string content
if filename.is_empty() {
do_something();
}
但是,这将引发以下错误:
temporary value dropped while borrowed: borrow later used here
文档没有对如何保持生命周期进行初始化的调用范围之外没有太多的了解。我已经看到了示例here和here。这两个示例都暗示要么抛出值,要么转换为Option类型,我都不想要。我只想在函数成功后获取基本的&str
值。也欢迎使用std :: option的任何其他常规建议。
答案 0 :(得分:2)
您的问题不是Option
本身,而是代码创建的临时文件。您的主线很长,因此请对其进行剖析:
let temp: PathBuf = conicalize(PathBuf::from(filename)).unwrap();
let filename: &str = temp.to_str();
现在您以后使用filename
的代码就可以了。您可能想知道为什么编写临时变量会有所作为。答案是,由编译器创建的临时文件会在包含该临时文件的句子的末尾被销毁。
请注意,filename
实际上是一个引用,因此它必须具有关联的生存期,很明显,它是变量temp
的生存期, 1 。这意味着filename
不能超过temp
。但是在您的代码中,temp
实际上不是一个命名变量,而是一个临时变量,当行完成时,该临时变量将被销毁,并且filename
变得不可用。
如果您阅读了完整的编译器错误,则会看到:
注意:考虑使用
let
绑定来创建寿命更长的值。
这完全表明了这一点。
[1]:如果您阅读PathBuf
:fn to_str<'a>(&'a self) -> Option<&'a str>
的功能定义,则很明显(为清楚起见增加了寿命)。