繁体   English   中英

如何将 Option<&str> 转换为 &str?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM