iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

WebAssembly + Rust 的前端應用系列 第 11

[Day 11] Rust Control Flow 控制流程

  • 分享至 

  • xImage
  •  

各位好,今天要來介紹的是 Rust 的控制流程那麼其實也就是各位熟悉的 if else for loop 等用法。那就馬上開始吧!

if Expressions

if 就是所有程式語言都一定會有的表達式,就不必多做介紹了直接來看例子吧!

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }
}

看起來沒什麼特別的地方我們可以用之前學到 match 改寫看看,

use std::cmp::Ordering;
fn use_match(number: i32) {
    let compare = 3;

    match number.cmp(&compare) {
      Ordering::Less => println!("Less"),
      Ordering::Greater => println!("Greater"),
      Ordering::Equal => println!("Equal"),
    }
}

數字有 cmp 的方法可以直接做比對這可以少寫很多程式。

Note: 那麼有一個地方要注意 if 陳述只接受 boolean 值所以例如,

fn main() {
  let number = 3;
  if number {
     ^^^^^^ expected bool, found integer
     println!("number was three");
  }
}

這個例子就會報錯。

也就是不能跟 javascript 一樣很懶的隨便丟進去判斷了,這也讓我覺得 js 真的是太不嚴謹的語言了,以後就用 ts 寫好了 XD。

接著來看看多個不同的條件的寫法,

fn mul_condition(number: i32) {
  if number % 4 == 0 {
    println!("number is divisible by 4");
  } else if number % 3 == 0 {
    println!("number is divisible by 3");
  } else if number % 2 == 0 {
    println!("number is divisible by 2");
  } else {
    println!("number is not divisible by 4, 3, or 2");
  }
}

也跟其他語言大同小異。

還記得我們之前提過的 expression 跟 statement 嗎? If 本身也是 expression 所以可以用下面的寫法,

fn use_if_expression() {
  let condition = true;
  let number = if condition {
      5
  } else {
      6
  };

  println!("The value of number is: {}", number);
  // The value of number is: 5
}

但是注意如果兩個 expression 的型態不同則會報錯,例如,

fn use_if_expression() {
  let condition = true;

  let number = if condition {
      5
  } else {
    "six"
    ^^^^^ expected integer, found &str
  };

  println!("The value of number is: {}", number);
}

5 和 "six" 是不同類型所以在編譯時期就會報錯。

loop

接者我們來看 loop,先舉一個很簡單的例子。

fn main() {
    loop {
        println!("again!");
    }
}

不用執行也能猜到這個 again and again 會跑到天荒地老海枯石爛~

那麼我們接著來看一個比較複雜的例子,

fn loop_result() {
  let mut counter = 0;

  let result = loop {
      counter += 1;

      if counter == 10 {
          break counter * 2;
      }
  };

  println!("The result is {}", result);
  // The result is 20
}

這個例子把 loop 跟 expression 的 return 結合然後當加到 10 的時候中斷 loop 再把 10 * 2 所以 result 會是 20。

While

while 就是有條件的 loop 如果條件符合的話才往下執行否則就會直接中斷,讓我們看個例子,

let mut number = 3;

while number != 0 {
    println!("{}!", number);

    number -= 1;
}

println!("LIFTOFF!!!");

這個很簡單就是如果 number 不等於 0 則把 number 扣到 0 為止。

For

接著就是每個程式語言都一定有的 for 迴圈而 Rust 的 for 基本上是最常用來處理 collection 的也最安全的用法因為他不用自己控制 index 例如下面的作法是不推薦的,

fn main() {
    let a = [10, 20, 30, 40, 50];
    let mut index = 0;

    while index < 5 {
        println!("the value is: {}", a[index]);

        index += 1;
    }
}

Note: 這是 Rust 不推薦的作法因為我們必須自己控制 index ,而有可能超出範圍讓程式 panic。

因此 Rust 讓我們使用 for 來處理更安全跟簡潔,例如,

  let a = [10, 20, 30, 40, 50];

  for element in a.iter() {
      println!("the value is: {}", element);
  }

另外如果我們只是想單純迴圈個幾次則可以這樣寫,

fn main() {
    for number in (1..4).rev() {
        println!("{}!", number);
    }
    println!("LIFTOFF!!!");
}

是不是簡潔許多呢?

總結

恭喜各位所有的基礎語法都已經學完了!/images/emoticon/emoticon34.gif

下一篇會介紹 Rust 一個非常重要的概念 Ownership,那麼我們明天見!

最後一樣有問題歡迎發問

/images/emoticon/emoticon07.gif


上一篇
[Day 10] Rust Functions 函式
下一篇
[Day 12] Rust Ownership 所有權 (1)
系列文
WebAssembly + Rust 的前端應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言