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

杰瑞德·帕尔

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]:如果你明显读取的函数的定义PathBuffn to_str<'a>(&'a self) -> Option<&'a str>(添加为了清楚消隐寿命)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章