gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:15:13 27 4
gpt4 key购买 nike

我发现 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 

文档没有提供太多关于如何在它们初始化的调用范围之外持久化生命周期的见解。我看过例子 herehere .这两个示例都暗示要么丢弃该值,要么转换为 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变得不可用。

如果您阅读完整的编译器错误,您会看到:

note: consider using a let binding to create a longer lived value.

这恰恰表明了这一点。

[1]:如果你阅读 PathBuf 的函数定义就很明显了: fn to_str<'a>(&'a self) -> Option<&'a str> (为了清楚起见,添加了省略的生命周期)。

关于rust - 如何将 Option<&str> 转换为 &str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58036097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com