iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
自我挑戰組

嘗試30天學「不」會Rust系列 第 4

[Rust] 控制流程 (Control flow)

  • 分享至 

  • xImage
  •  

環境

OS: Windows 10
Editor: Visual Studio Code
Rust version: 1.63.0

目標

如同之前一樣,對於一些明確會是在其他地方已經碰過的相關主題,我會先想想我會需要什麼來快速的認識這個主題,控制流程(control flow)有寫過程式的應該都不陌生,陌生的可能是「控制流程」這四個字,其實就是我們很常在用的if..elsefor loop之類的。

下面是清單:

  1. if..else if..else
  2. switch..case..
  3. while loop
  4. for loop

判斷句

if...else if...else

首先,先用一道老題目來試試看,判斷閏年,下面是題目:

西元年份除以4不可整除,為平年。
西元年份除以4可整除,且除以100不可整除,為閏年。
西元年份除以100可整除,且除以400不可整除,為平年
西元年份除以400可整除,為閏年。

以下是實作:

let year = 2022;

if (year % 4) != 0 {
    println!("平年");
} else if (year % 4 == 0) && (year % 100 != 0) {
    println!("閏年");
} else if (year % 100 == 0) && (year % 400 == 0) {
    println!("平年");
} else if year % 400 == 0 {
    println!("閏年");
}

OK!看起來跟其他語言沒有太多的差別。

match

在Rust中,並沒有switch..case..關鍵字,取而代之是用match

以下是官方的example:

let num = 19;

match num {
    0 => println!("Zero!"),
    1 => println!("One!"),
    2 | 3 | 5 | 7 | 11 => println!("This is a prime."), // 分散的
    13..=19 => println!("A teen."), // 連續的,[13, 19]
    _ => println!("Nothing special."),
}

可以知道幾件事:

  1. match的使用方法
  2. 如果有分散的多個case為同一結果,該怎麼寫
  3. 如果有連續的多個case為同一結果,該怎麼寫
  4. default的狀態如何處理,_是Rust裡的default

迴圈

while

while的話,跟其他我所認識的語言沒甚麼不同:

let mut count_down = 3;

while count_down > 0 {
    println!("{}!", count_down);

    count_down -= 1;
}

println!("發射!!!");

forloop

在前一篇靜態陣列其實就有看到for loop的身影,而且這應該是最常用到的到迴圈語法了吧,跟while來比的話。

一樣用一個陣列來做實驗,今天想簡單一點,前一篇輸出矩陣的用法,之後後面有談**Rust的集合(collection)**再做應該也不遲。

let arr = [1, 2, 3, 4, 5, 6, 7];
// 陣列index從頭到尾
for index in 0..arr.len() {
    println!("index {} is {}", index, arr[index]);
}

// 陣列利用iterator從頭到尾
let mut index = 0;
for element in arr {
    println!("index {} is {}", index, element);
    index += 1;
}

// 陣列index從0到3
for index in 0..4 {
    println!("index {} is {}", index, arr[index]);
}

// 陣列index從0到4
for index in 0..=4 {
    println!("index {} is {}", index, arr[index]);
}

// Reverse! index從3到0
for index in (0..4).rev() {
    println!("index {} is {}", index, arr[index]);
}

loop

這個在其他語言就沒有看過了,看起來是Rust獨有的關鍵字,用法如下:

// 顯示出 1 ~ 10
let mut x = 0;

loop {
    x += 1;
    println!("Number => {}", x);
    if x >= 10 {
        break;
    }
}

loop他是屬於無限迴圈,只要呼叫就會開啟一直跑,除非碰到條件然後break出去。

let陳述式與判斷句、迴圈的合併使用

有時會遇到像這樣的問題,會是這樣的寫法,以判斷正負數為範例:

let num = -99;
let mut sign: i8 = 0;
if num < 0 {
    sign = -1;
} else {
    sign = 1;
}

但在Rust裡面,我們可以這樣寫,更簡潔:

let num = -99;
let sign = if num < 0 { -1 } else { 1 }; // 記得semicolon
println!("正負數? {}", sign);

loop的話,也可以這樣使用,在break之後回傳我們要的值,以下是文件的範例:

let mut counter = 0;

let result = loop {
    counter += 1;

    if counter == 10 {
        break counter * 2;
    }
}; // 記得semicolon

println!("結果為:{}", result);

Reference

官方教程(非官方中文翻譯) - 控制流程
Rust by example - match


上一篇
[Rust] 靜態陣列與Tuple
下一篇
[Rust] 函式 (Function)
系列文
嘗試30天學「不」會Rust18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言