Rust中Option的as_ref与as_deref区别及代码场景疑问
关于Rust中
as_deref()的使用及as_ref与as_deref的区别 问题场景
我正在使用如下Rust代码片段:
let stackoverflow = format!("{}{}{}","\social[stackoverflow]{",request.cv_main.stackoverflow.as_deref().unwrap_or_default(),"} ");
其中request的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()。我已阅读相关文章但仍未理清,能否简单解释as_ref与as_deref的区别?
为什么这里需要用as_deref()
你的场景里,stackoverflow是Option<String>类型,而unwrap_or_default()需要的是引用类型,且该类型要实现Default。
如果直接写request.cv_main.stackoverflow.unwrap_or_default(),编译会报错——因为Option<String>的unwrap_or_default()返回的是String,但format!实际需要的是&str类型的字符串引用。as_deref()的作用就是把Option<String>转换成Option<&str>,此时调用unwrap_or_default()会返回&str类型的默认值(空字符串""),刚好匹配format!的参数要求。
as_ref和as_deref的核心区别
as_ref:负责把T转成&T,或者把Option<T>转成Option<&T>。比如对Option<String>调用as_ref(),得到的是Option<&String>。as_deref:在as_ref的基础上多做一步自动解引用——把引用类型转换成它的目标类型。比如Option<&String>会被转成Option<&str>,这是因为String实现了Dereftrait,能自动解引用为str。
举个直观的代码例子:
let opt_str: Option<String> = Some("hello".to_string()); // as_ref()得到Option<&String> let opt_ref_str = opt_str.as_ref(); // 要拿到&str,得手动解引用:&**opt_ref_str.unwrap() // as_deref()直接得到Option<&str> let opt_deref_str = opt_str.as_deref(); // 直接用:opt_deref_str.unwrap()就是&str类型
简单总结:as_deref()是as_ref()加自动解引用的组合,当你需要从Option<所有权类型>(比如Option<String>)得到Option<&目标引用类型>(比如Option<&str>)时,用as_deref()会更简洁。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

