Rust 中的流程控制語句稱爲 流程控制表達式。編程
表達式必定會有之,因此 if 表達式的分支必須返回同一個類型的值才能夠。這也是 Rust 沒有三元操做符的緣由。 If 表達式的求值規則和塊表達式一致。數組
fn main () {
let n = 13;
let big_n = if (n < 10 && n > -10) {
10 * n
} else {
n / 2
}
assert_eq!(big_n, 6)
}
複製代碼
上述代碼中, big_n 的賦值是由一個 if 表達式來完成的。 經過計算 n 區間大小,來決定最終的值。由於 n 是 13, 雖然沒有明確指定類型,但 Rust 會推斷其爲 i32 類型,在 if 條件分支中,對 n 求積獲得的結果確定是整數。 Rust 已經將 big_n 推斷類型爲 i32 因此在計算 n 除以 2 的時候,Rust 編譯器會對結果進行截取,去除小數點後面的部分。最終結果爲 6markdown
Rust 中包括了三種循環表達式: while、loop 和 for … in 表達式,用法與其餘語言一致數據結構
fn main () {
for n in 1..101 { // 1..101 迭代器 Range 0 ~ 101
if n % 15 == 0 {
println!("fizzbuzz");
} else if n % 3 === 0 {
println!("fizz");
} else if n % 5 == 0 {
println!("buzz");
} else {
println!("{}", n);
}
}
}
複製代碼
for ... in
表達式本質山是一個迭代器,其中 1..101
是一個 Range
類型,是一個迭代器。 當須要使用無限循環的時候,必定要使用 loop
循環,避免使用 while true
循環。編程語言
fn while_true (x: i32) -> i32 {
while true {
return x + 1;
}
// 修復此處函數報錯須要在此處加一個返回值
x
}
fn main () {
let y = while_true(5);
assert_eq!(y, 6)
}
複製代碼
此段代碼在編譯器中會報錯,錯誤提示成,while true 模塊返回的是單元值,而函數 while_true 返回值是 i32,因此不匹配。 這是由於 Rust 編譯器在對 while 循環作流分析(Flow Sensitive) 的時候,不會檢查循環條件,編譯器認爲 while 循環條件可真可假,因此循環體內的表達式也會被忽略,此時編譯器只知道 while true 循環返回的是單元值,而函數的返回時 i32,因此拋出錯誤,這一切都是由於 CTFE 功能的限制,while 條件表達式沒法做爲編譯器常量來使用。函數
Rust 提供了 match 表達式oop
fn main () {
let number = 42;
match number {
0 => println!("Origin"),
1...3 => println!("All"),
| 5 | 7 | 13 => println!("Bad Luck"),
n @ 42 => println!("Answer is {}", n),
_ => println!("Common")
}
}
複製代碼
Match 用於匹配各類狀況,相似於 switch case 語句學習
Match 分支使用了**模式匹配(Pattern Matching)**技術。模式匹配在數據結構字符串中京城出現,好比在某個字符串中找出與該子串相同的全部淄川。 在編程語言中,模式匹配用於判斷類型或值是否存在能夠匹配的模式。spa
在 Rust 語言中,match 分支左邊就是模式,右邊就是代碼。模式匹配同時也能夠是一個表達式,和 if 表達式相似,全部分支必須返回同一個類型。可是左側的模式能夠是不一樣的。 代碼中,使用的模式分別是 單個值、範圍、多個值和通配符。其中 操做符 @ 能夠將模式中的值綁定給一個變量,供分支右側代碼使用,這類匹配叫** 綁定模式(Binding Mode)。** match 表達式必須窮盡每一種可能,因此通常狀況下,會使用 通配符_
來處理剩餘狀況。 除了 match 表達式,還有 let 綁定、函數參數、for 循環等位置都用到了模式匹配。指針
Rust 提供了if let
和 while let
表達式,分別用來在某些場合替代 match 表達式。
fn main () {
let boolean = true;
let mut binary = 0;
if let true = boolean {
binary = 1;
}
assert_eq!(binary, 1);
}
複製代碼
代碼清單中使用了 if let
表達式,和 match 表達式類似, if let
左側爲模式,右側爲要匹配的值。若是 boolean 爲 true,binary 值修改成 1。 在使用循環的某些場合下,也可使用 while let
來簡化代碼
fn main () {
let mut v = vec![1, 2, 3, 4, 5];
loop {
match v.pop() {
Some(x) => println!("{}", x),
None => break,
}
}
}
複製代碼
在上述代碼中,建立了動態數組 v,而且想要將其中的元素經過 pop 方法一次去出並打印。此處使用 loop 循環,由於調用 v 的 pop 方法會返回 Option 類型。因此用 match 匹配兩種狀況, Some(x) 和 None。 Rust 中引入 Option 類型時爲了防止空指針的出現。Some(x) 用於匹配數組彙總的元素,而 None 用於匹配數組被取空的狀況,當數組爲空時,就從循環中跳出(break)。
while let
對上述代碼作簡化
fn main () {
let mut v = vec![1,2,3,4,5];
while let Some(x) = v.pop() {
println!("{}", x);
}
}
複製代碼
代碼中,使用了 while let
表達式,與if let
相似,其左側 Some(x)爲匹配模式,會匹配右側 pop 方法調用返回的 Option 類型結果,並自動建立 x 綁定供 println! 宏語句使用,若是數組中的值去空,則自動跳出循環。
#Rust學習