16.枚举中的option和result.rs
生活随笔
收集整理的這篇文章主要介紹了
16.枚举中的option和result.rs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
fn test_option() {//Option 是 Rust 標準庫中的枚舉類,這個類用于填補 Rust 不支持 null 引用的空白/*enum Option<T> {Some(T),None,}*/let opt = Option::Some("Option_Some_str");match opt {Option::Some(something) => {println!("{}", something);}Option::None => {println!("opt is nothing");}}//如何將option的值取出來?{//方法1fn get_option_value() -> Result<i32, String> {let t = Option::Some(100).ok_or("111")?;println!("get the value successfully - {}", t);Ok(0)}let _ = get_option_value();方法2let t = Some(112);if let Some(v) = t {println!("v -- {}", v);}方法3let t = Some(112);let t2 = t.unwrap();println!("v -- {}", t2);}//如果你的變量剛開始是空值,你體諒一下編譯器,它怎么知道值不為空的時候變量是什么類型的呢?所以初始值為空的 Option 必須明確類型let opt: Option<&str> = Option::None;match opt {Option::Some(something) => {println!("{}", something);}Option::None => {println!("opt is nothing");}}//由于 Option 是 Rust 編譯器默認引入的,在使用時可以省略 Option:: 直接寫 None 或者 Some()//Option 是一種特殊的枚舉類,它可以含值分支選擇let t = Some(64);match t {Some(64) => println!("Yes64"),Some(72) => println!("Yes72"),_ => println!("No"),}//普通matchlet i = 0;match i {0 => println!("zero"),_ => {}}//常用函數: is_some,is_none,contains,as_ref,expect,unwrap,unwrap_or,map,map_or,ok_or,and_then...//ok_or可以在值為None的時候返回一個Result::Err(E),值為Some(T)的時候返回Ok(T)let t: Option<i32> = Option::None;let _errr = t.ok_or("123");println!("_errr--->{:?}", _errr);let t: Option<i32> = Option::Some(128);let _errr = t.ok_or("123");println!("_errr--->{:?}", _errr);//這個組合算子可用于簡單映射Some -> Some 和 None -> None 的情況。多個不同的 map() 調用可以更靈活地鏈式連接在一起。let op_map = t.map(|mut param| {param = 100;param});println!("op_map--->{:?}", op_map);t.ok_or(123);
}fn test_result() {//常用函數: is_ok,is_err,ok,err,as_ref,as_mut,map,map_or,map_err,and_then,or,unwrap_or,,,,,,,,,,fn test_result_in() -> Result<i32, String> {println!("---------------------------");//return Err(String::from("123"));return Ok(123);}//如何將Result的值取出來?fn get_result_value() -> Result<i32, i32> {let t: Result<i32, i32> = Ok(1000);let t2 = t?;println!("get the value successfully - {}", t2);Ok(0)}let _ = get_result_value();let ret = test_result_in();//map() 以鏈式調用的方式來簡化 match 語句。然而,在返回類型是 Option<T> 的函數中使用 map() 會導致出現嵌套形式 Option<Option<T>>。多層鏈式調用也會變得混亂。所以有必要引入 and_then()let ret2 = ret.and_then(|mut param| {param = 1000;Ok(param)});let ret3 = ret2.map_err(|e| e.to_string());println!("{:?}", ret3);ret3.ok();
}//看一個例子
fn double_first(vec: Vec<&str>) -> Result<i32, String> {vec.first()// 若值存在則將 `Option` 轉換成 `Result`。// 否則提供一個包含該字符串(`String`) 的 `Err`。.ok_or("Please use a vector with at least one element.".to_owned())// 回想一下,`parse` 返回一個 `Result<T, ParseIntError>`。.and_then(|s| {s.parse::<i32>()// 映射任意錯誤 `parse` 產生得到 `String`。// (原文:Map any errors `parse` yields to `String`.).map_err(|e| e.to_string())// `Result<T, String>` 成為新的返回類型,// 我們可以給里面的數字擴大兩倍。.map(|i| 2 * i)})
}/*
簡單的總結:ok():檢查Option是否為空,返回一個Result值,不為空就就是Ok(T)的枚舉,為空就是Err(E)的枚舉
調用者:Result
參數:空
返回值:Option或Resultok_or():檢查Option是否為空,返回一個Result值,不為空就就是Ok(T)的枚舉,為空就是Err(E)的枚舉
調用者:Option或Result
參數:錯誤信息
返回值:Resultmap():可以處理Option和Result兩種枚舉,只處理Option::Some(T),None原樣返回,Result只處理Ok(T),Err原樣返回
調用者:Option或Result
參數:閉包函數
返回值:Option或Resultmap_err():只處理Result里面的Err,
調用者:Result
參數:閉包函數
返回值:Resultand_then():和map函數及其類似,只不過返回值不同,map操作Option肯定返回的是Option,map操作Result肯定返回的是Result,and_then相當于給結果脫了一層衣服
調用者:Option或Result
參數:閉包函數
返回值:閉包返回值
*/fn main() {test_option();test_result();let t = Some(123);let t2 = t.unwrap();let s: Result<i32, &str> = Ok(123);//let s: Result<i32, &str> = Err("123");let s2 = s.unwrap();println!("{}", s2);
}
?
總結
以上是生活随笔為你收集整理的16.枚举中的option和result.rs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15.枚举enum.rs
- 下一篇: 17.默认值Default.rs