Option
对于变量的整个生命周期范围,我发现有些困惑。我一直在尝试从匹配模式Some
内部提取基础值,Option
如下所示:
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
该文档并没有提供太多关于如何在其初始化的调用范围之外保留生命周期的见解。我在这里和这里都看到了示例。这两个示例都暗示要么抛出该值,要么转换为Option
,我都不想要。我只想&str
在函数成功后获取基本值。
您的问题不在Option
于其本身,而在于您的代码创建的临时对象。您的主线很长,因此请对其进行剖析:
let temp: PathBuf = conicalize(PathBuf::from(filename)).unwrap();
let filename: &str = temp.to_str();
现在,您以后使用filename
该代码的代码才有效。您可能想知道为什么编写临时变量会有所作为。答案是,由编译器创建的临时文件会在包含该临时文件的句子的末尾被销毁。
注意,filename
实际上是一个参考,所以它必须具有相关联的寿命,这是很明显1,该变量的temp
。那意味着那filename
不可能长久temp
。但是在您的代码中,temp
实际上不是一个命名变量,而是一个临时变量,当行完成时,该临时变量将被销毁并filename
变得无法使用。
如果您看到了完整的编译器错误,则会看到以下内容:
注意:请考虑使用
let
绑定来创建更长的价值。
这恰恰表明了这一点。
[1]:如果你明显读取的函数的定义PathBuf
:fn to_str<'a>(&'a self) -> Option<&'a str>
(添加为了清楚消隐寿命)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句