rust學習四、控制語句

正在战斗中發表於2024-11-04

rust的控制語句和大部分語言沒有什麼區別,都是熟悉的for,while,loop,if。

比較不同的是,在絕大部分非常流行的語言中都有的switch,rust是沒有的。

諸如c/c++,java,javascript,c#。連PL/SQL都有case when語句。

一、基本的for、while、if,loop

示例-for,while,loop,if

/**
  學習控制流
  條件  if
  迴圈  for,loop,while
       注意:for有各種各樣的實現方式
*/
use std::io;

fn main() {
    println!("請輸入你的年齡");
    let mut age = String::new();
    io::stdin().read_line(&mut age).expect("讀取失敗");
    let age: u32 = age.trim().parse().expect("請輸入一個數字");

    let mut desc = String::new();
    let mut total: u32 = 0;

    //1.0 測試 if ,else if
    if (age < 20) {
        println!("你是{}歲,還年輕", age);
        total = cal_young(age);
    } else if (age < 70) {
        println!("你是{}歲,正當壯年,是國家和家庭棟樑", age);
        total = cal_strong(age);
    } else {
        println!("你是{}歲!老驥伏櫪,志在千里;壯士暮年,烈心不已", age);
        total = cal_old(age);
    }

    //1.1 測試if 條件表示式賦值
    //rust的函式和許多語句中,如果最後一個語句不帶分號,往往表示返回值

    desc = if age < 70 {
        "壯年".to_string()
    } else {
        "老年".to_string()
    };
    println!("{}歲,屬於{}", age, desc);

    println!("總數={}", total);

    //for 迴圈比較多實現方式
    // a. in [] array  ,例如  in [1,2,3]
    // b. in range   ,例如  in (1..10),但10不在內
    if (age <= 50) {
        let fib: u32 = calFb(age);
        println!("{}的斐波那契值={}", age, fib);
    }

    test_for_with_array();
    test_for_with_tuple();
}

//for迴圈-陣列
fn test_for_with_array() {
    println!("for遍歷陣列");
    for i in [1, 2, 3, 10] {
        println!("陣列元素:{}", i);
    }
}

//for迴圈-元組,..
//使用..的時候,兩邊帶不帶()都是一樣的。帶()主要是為了構建一個物件,便於左其它操作
fn test_for_with_tuple() {
    for i in (1..5) {
        println!("{}", i);
    }
    for i in 6..10 {
        println!("{}", i);
    }
    //倒數
    //
    for i in (1..10).rev() {
        println!("倒數:{}", i);
    }
}

fn cal_young(a: u32) -> u32 {
    let mut total: u32 = 0;
    //測試for迴圈
    //注意 寫成 n..m 那麼上限是不會計算在內的
    for i in 1..a + 1 {
        total += i;
    }
    return total;
}

fn cal_strong(a: u32) -> u32 {
    let mut i = 0;
    let mut total: u32 = 0;
    //測試loop,必須內部加break;
    loop {
        i = i + 1;
        total = total + i;
        if (i == a) {
            break;
        }
    }
    return total;
}

fn cal_old(a: u32) -> u32 {
    let mut total: u32 = 0;
    let mut i = 0;
    //測試while
    while i < a {
        i = i + 1;
        total = total + i;
    }
    return total;
}
/**
 計算斐波那契,但是這個不要用於計算太大的值,因為這個遞迴演算法極其低效
 計算50以內還馬馬虎虎
 注意:如果有錯誤,那麼非蛇形的命名方式會被編譯器提示出來
*/
fn calFb(n: u32) -> u32 {
    if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 1;
    } else {
        return calFb(n - 1) + calFb(n - 2);
    }
}

這其中for的格式比較多,許多語言都有這種現象,例如JAVA。

二、rust的for可以的格式

for i in n.m 使用它使用 std::iter::Rangestd::iter::RangeInclusive 迭代器

for i in (n..m).rev()

for i in [x,y,z]

其它還有基於map,向量,列舉的便捷方式這些物件元素的方式

對於map,向量、列舉的,後續補充例子。

三、match而不是switch

在有關書籍中,第一個例子就有match。

match guess.cmp(&secret_str){
            Ordering::Less => println!("偏小"),
            Ordering::Greater => println!("偏大"),
            Ordering::Equal => {println!("恭喜,你贏了!你總共花費了{}次",try_times);is_ok=true;}
};

按照文件的描述,rust的match是一個比較奇特的東西。

match和JAVA17以上的switch還是有一定相似度的,也不知道誰抄誰。

在rust的書本上<<Rust權威指南>>把match吹了一番。

閒話少扯,還是先掌握match的一些基本內容吧。

四、小結

和大部分語言差不多,rust的控制結構沒有特別的,這很好,因為它奇怪的語法已經夠多了。

和現代大部分的語言語言一樣,rust也力圖讓for迴圈變得更加方便一些。

相關文章