![](/img/trans.png)
[英]How to convert from tuple (Option<&str>, Option<&str>) to tuple (Option<String>, Option<String>)?
[英]How to convert Option<&str> into &str?
当涉及到变量的生命周期范围时,我发现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
该文档没有提供太多关于如何在它们初始化的调用的 scope 之外保持生命周期的见解。我在这里和这里看到了示例。 这两个示例都暗示要么丢弃值,要么转换为Option
,这两个我都不想要。 一旦 function 成功,我只想获得底层&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 的PathBuf
的定义,则显而易见: fn to_str<'a>(&'a self) -> Option<&'a str>
(为清楚起见添加了省略的生命周期)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.