现在我使用像这样的 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