Rust 中的 Option as_ref 和 as_deref 有什么不同

Dol*_*hin 2 rust

现在我使用像这样的 Rust 代码片段:

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

这是 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>>,
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但我仍然无法理解为什么这里需要使用as_deref(). 我读过这篇文章https://www.fpcomplete.com/blog/rust-asref-asderef/,仍然没有弄清楚。有没有简单的解释 as_ref 和 as_deref 的不同之处?

use*_*342 10

调用 an Option<String>as_ref()返回 an Option<&String>as_deref()另一方面返回Option<&str>,您也可以使用.map(|s| s.as_str())或获得它.map(|s| &*s)。(后者通常相当于as_deref(),并演示了String“取消引用”到str,这就是它被称为 的原因as_deref()。)

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

unwrap_or_default()可以被调用,因为Option<&str>Implements&str 返回对静态分配的单例的引用。另一方面,没有为 实现,因为它必须返回对比它寿命更长的 a 的引用,这是借用检查器不允许的。Default<&str as Default>::default()""Default&StringString