Rust 編程之道 - 流程控制

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 條件表達式沒法做爲編譯器常量來使用。函數

match 表達式與匹配模式

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 循環等位置都用到了模式匹配。指針

if let 和 while let 表達式

Rust 提供了if letwhile 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學習

相關文章
相關標籤/搜索