我试图使这种转换(Option<Option<String>>Option<Option<&str>>)成为可能,但我仍然失败后,try 了许多方法,包括使用.map.

I know that the conversion is possible, however, if there's no nested Option (i.e. Option<String> to Option<&str>): just using .as_deref().
Using .map(|inner| inner.as_deref()) violates the ownership.

推荐答案

使用普通的map会违反所有权规则,因为它需要self.你正在消耗外部的Option,然后试图从它里面借点什么,这是不起作用的.

然而,这里有一个简单的方法,在map中使用as_ref,然后使用as_deref.as_ref&Option<T>转换为Option<&T>,其中TOption<String>,因此当您调用map时,您将得到&Option<String>,然后您可以安全地将其传递到as_deref.

fn main() {
    let foo = Some(Some(String::from("abc")));
    let bar: Option<Option<&str>> = foo.as_ref().map(|r| r.as_deref());
    eprintln!("{:?}", bar);
}

Rust相关问答推荐

基于对vec值的引用从该值中删除该值

程序退出后只写入指定管道的数据

如何从Rust记录WASM堆内存使用情况?

展开枚举变量并返回所属值或引用

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

用于判断整数块是否连续的SIMD算法.

try 创建随机数以常量

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

在 Rust 中查找向量中 dyn struct 的索引

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

为什么 Rust 的临时值有时有参考性有时没有?

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

如何在 Rust 中编写涉及异步的重试函数

使用 `.` 将 T 转换为 &mut T?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

在特征中返回一个 Self 类型的值