<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
書接上文,本篇部落格分享的是Rust 列舉類與模式匹配 的知識。作為安全性強的語言,Rust 的列舉類並不像其他程式語言中的概念那樣簡單,但依然可以十分簡單的使用。
列舉允許我們列舉所有可能的值來定義一個型別,列舉中的值也叫變體
我們舉一個例子:
IP地址:IPV4、IPV6
enum IpAddrKind{ V4, V6 }
接收列舉值
let four=IpAddrKind::V4; let six=IpAddrKind::V6;
列舉的變體都位於識別符號的名稱空間下,使用::
進行分割
形式如下:
enum IpAddr{ V4(String), V6(String) }
優點:
struct
來確定型別例如:
#[derive(Debug)] enum IpAddrKind { V4(u8,u8,u8,u8), V6(String) } fn main() { let home=IpAddrKind::V4(127, 0, 0, 1); let loopback=IpAddrKind::V6(String::from("這是IPV6")); println!("{:?}n{:?}",home,loopback); }
執行效果:
#[derive(Debug)]
作為Rust提供的偵錯庫是可以直接輸出結構體和列舉型別的{:?}
struct IpV4Addr{ //--snip-- } struct IpV6Addr{ //--snip-- } enum IpAddr { V4(IpV4Addr), V6(IpV6Addr) }
enum Message { Quit, Move {x:i32,y:u32}, Write(String), ChangeColor(i32,i32,i32) } fn main() { let q=Message::Quit; let m=Message::Move { x: 6, y: 12 }; let w=Message::Write(String::from("hello_world")); let c=Message::ChangeColor(255, 255, 0); }
在這段程式碼中列舉類變體一共有四種資料型別:
Quit
Move
Write
ChangeColor
和結構體方法類似,使用impl
關鍵字:
impl Message{ fn call(&self){} }
這裡就不具體實現了,此時列舉的所有變體都可以呼叫call
方法,例如q.call();
Option
是 Rust 標準庫中的列舉類,這個類用於填補 Rust 不支援 null
參照的空白。null
經常在開發者把一切都當作不是 null 的時候給予程式致命一擊:畢竟只要出現一個這樣的錯誤,程式的執行就要徹底終止。Rust 在語言層面徹底不允許空值 null 的存在,但無奈null 可以高效地解決少量的問題,所以 Rust 引入了 Option 列舉類:
enum Option<T>{ Some(T), None }
列舉類包含在預匯入模組中(Prelude),可直接使用:
let some_number=Some(5); let some_string=Some("a string") let absent:Option<&str>=None;
注意:
absent
屬於None的變體,因此是無效資料,也就是null
Rust 通過 match 語句來實現分支結構。先認識一下如何用 match 處理列舉類:
fn main() { enum Book { Papery {index: u32}, Electronic {url: String}, } let book = Book::Papery{index: 1001}; let ebook = Book::Electronic{url: String::from("url...")}; match book { Book::Papery { index } => { println!("Papery book {}", index); }, Book::Electronic { url } => { println!("E-book {}", url); } } } //執行結果:Papery book 1001
這是由於book
屬於Papery
的變體,因此會執行第一個列印語句
match 塊也可以當作函數表示式來對待,它也是可以有返回值的:
match 列舉類範例 { 分類1 => 返回值表示式, 分類2 => 返回值表示式, ... }
但是要謹記:所有返回值表示式的型別必須一樣!
如果把列舉類附加屬性定義成元組,在 match 塊中需要臨時指定一個名字:
enum Book { Papery(u32), Electronic {url: String}, } let book = Book::Papery(1001); match book { Book::Papery(i) => { println!("{}", i); }, Book::Electronic { url } => { println!("{}", url); } }
變體Papery指定了i
變數,Electronic指定了url
match 除了能夠對列舉類進行分支選擇以外,還可以對整數、浮點數、字元和字串切片參照(&str)型別的資料進行分支選擇。其中,浮點數型別被分支選擇雖然合法,但不推薦這樣使用,因為精度問題可能會導致分支錯誤。
對非列舉類進行分支選擇時必須注意處理例外情況,即使在例外情況下沒有任何要做的事。例外情況用下劃線 _ 表示:
fn main() { let t = "abc"; match t { "abc" => println!("Yes"), _ => {}, } }
通過一個簡單的流程控制程式碼理解此部分知識:
let i = 0; match i { 0 => println!("zero"), _ => {}, } //主函數中執行結果:zero
這段程式的目的是判斷 i 是否是數位 0,如果是就列印 zero。
那麼現在用 if let 語法縮短這段程式碼:
let i = 0; if let 0 = i { println!("zero"); }
if let 語法格式如下:
if let 匹配值 = 源變數 { 語句塊 }
else
塊來處理例外情況。if let 語法可以認為是隻區分兩種情況的 match 語句的"語法糖"
在列舉類中的使用:
fn main() { enum Book { Papery(u32), Electronic(String) } let book = Book::Electronic(String::from("url")); if let Book::Papery(index) = book { println!("Papery {}", index); } else { println!("Not papery book"); } } //執行結果:Not papery book
Rust 列舉類和模式匹配的知識就分享到這裡了,期待你的鼓勵,這將是我創作的不竭動力!
到此這篇關於Rust指南列舉類與模式匹配精講的文章就介紹到這了,更多相關Rust列舉類與模式匹配內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45