现在我使用的是如下的铁 rust 代码片段:

let stackoverflow = format!("{}{}{}","\\social[stackoverflow]{",request.cv_main.stackoverflow.as_deref().unwrap_or_default(),"}\n");

下面是定义的请求cv_main:

use serde::{Deserialize, Serialize};

use super::{edu::edu::CvEduResp, work::cv_work_resp::CvWorkResp};

#[derive(Serialize, Deserialize, Default, Clone)]
pub struct CvMainResp {
    pub id: i64,
    pub cv_name: String,
    pub created_time: i64,
    pub updated_time: i64,
    pub user_id: i64,
    pub cv_status: i32,
    pub template_id: i64,
    pub employee_name: Option<String>,
    pub birthday: Option<String>,
    pub phone: Option<String>,
    pub email: Option<String>,
    pub stackoverflow: Option<String>,
    pub github: Option<String>,
    pub blog: Option<String>,
    pub edu: Option<Vec<CvEduResp>>,
    pub work: Option<Vec<CvWorkResp>>,
}

这段代码运行得很好,但我还是不明白为什么这里需要用as_deref().我看了https://www.fpcomplete.com/blog/rust-asref-asderef/篇文章,还是想不通.有什么简单的解释可以解释as_ref和as_deref的区别吗?

推荐答案

Option<String>上调用,as_ref()返回Option<&String>.另一方面,as_deref()返回Option<&str>,这也可以用.map(|s| s.as_str()).map(|s| &*s)获得.(后者通常等同于as_deref(),并显示Stringstr的"解除引用",这就是它被称为as_deref()的原因.)

虽然Option<&String>Option<&str>在功能上相似,但它们并不完全相同.在这里,as_deref()的要点是能够将其链接到.unwrap_or_default().

可以在Option<&str>上调用unwrap_or_default(),因为&str implements Default,<&str as Default>::default()只是返回对静态分配的""单例的引用.另一方面,Default不是为&String实现的,因为它必须返回对生命周期 超过它的String的引用.(据推测,它可能会懒惰地创建和泄漏一个,但这似乎没有必要,因为您总是可以使用&str来做这种事情.)

Rust相关问答推荐

Rust kill std::processs::child

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

关于如何初始化弱 struct 字段的语法问题

为什么这是&q;,而让&q;循环是无限循环?

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

如何在嵌套的泛型 struct 中调用泛型方法?

在Rust中克隆源自INTO_ITER()的迭代器的成本?

链表堆栈溢出

使用 pyo3 将 Rust 转换为 Python 自定义类型

Sized问题的动态调度迭代器Rust

decltype、dyn、impl traits,重构时如何声明函数的返回类型

为什么要这样编译?

Rust 中的方法调用有什么区别?

rust 中不同类型的工厂函数

如何在 Rust 中将 UTF-8 十六进制值转换为 char?

为什么会出现无法移出可变引用后面的 `self.x`错误?

相交着色器从 SSBO 中读取零

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

在 Rust 中退出进程

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器