第三章 Rust 基礎(chǔ)語法

官網(wǎng):https://www.rust-lang.org/
跟著例子學(xué) Rust:https://tourofrust.com/00_zh-cn.html
Rust 基礎(chǔ)入門指南:為 Solana 合約學(xué)習(xí)鋪路 https://learnblockchain.cn/column/113
菜鳥 Rust 教程:https://www.runoob.com/rust/rust-tutorial.html

一、輸出到終端

fn main() {
    // 輸出小圖標(biāo) => 
    println!("你好,??!"); // 你好,??!
    // 占位符輸出
    let x = 12;
    println!("x is {}", x); // x is 12
    // 多占位符輸出
    println!("x is {},{}", x, x); // x is 12,12
    // 指定index占位符輸出
    println!("x is {0},{0}", x); // x is 12,12
    // 輸出占位符(轉(zhuǎn)義{})
    println!("{{}}"); // {}
}

二、變量與常量

類型推斷

Rust 是強(qiáng)類型語言,但具有自動判斷變量類型的能力。變量的定義使用 let

let a = 1; // 等于 let a: i32 = 1

常用數(shù)據(jù)類型如下:

fn main() {
    // 整數(shù):8位 ~ 128位(8、16、32、64、128)*(有符號i、無符號u)
    // 默認(rèn)為 i:32
    let a: i128 = -42; // 有符號整數(shù)
    let b: u32 = 42; // 無符號整數(shù)

    // 浮點數(shù):32位、64位 默認(rèn)為 f64
    let c = 2.0; // f64
    let d: f32 = 3.0; // f32

    // 布爾數(shù)
    let e = true;
    let f: bool = false;

    // 字符類型:4字節(jié)(32位)
    // 采用 Unicode 編碼,可以存儲更廣泛的字符,如表情、數(shù)學(xué)符號
    // 而字符串 String 是多個字符的組合,組成的字符長度可變,每個字符可能占 1-4 字節(jié)(UTF-8 編碼)
    let g: char = 'A';
    let h: char = '??';
    let r: char = 'Ω';
    let j: char = '∑';

    // 元組
    // 復(fù)合類型,可以將不同類型的多個值組合進(jìn)一個復(fù)合類型
    // 結(jié)合函數(shù),返回多個不同類型的返回值,很好用
    let k: (i32, f32, u8) = (100, 6.4, 1);
    // 可以使用 點. 來訪問元組的值;也可以用變量接收的方式
    let k1 = k.0;
    let k2 = k.1;
    let (x, y, z) = k;
    println!("y is {}", y);

    // 數(shù)組
    // 與元組不同,數(shù)組的值必須是同一類型
    let a = [1, 2, 3, 4, 5];
    let b = ["January", "February", "March"];
    let c: [i32; 5] = [1, 2, 3, 4, 5];
    let d = [3; 5]; // 等同于 let d = [3, 3, 3, 3, 3];
    // 數(shù)組訪問
    let first = a[0];
    let second = a[1];

    a[0] = 123; // 錯誤:數(shù)組 a 不可變,元素不可重新賦值
    let mut a = [1, 2, 3]; // 可變數(shù)組
    a[0] = 4; // 正確
}

可變性與類型匹配

fn main() {
    let a = 1; // 默認(rèn)不可變
    a = 2; // 失敗
    let mut b = 10; // mut 修飾為可變變量
    b = 20; // 成功
    b = 20.0; // 失敗,類型不匹配
    b = "123"; // 失敗,類型不匹配
    println!("Hello, {},{}", a,b)
}

常量

常量的定義使用 const

const A:i32 = 123;

fn main() {
    println!("a is {}", A)
}

三、函數(shù)

基本格式:fn <函數(shù)名> ( <參數(shù)> ) -> 返回類型 <函數(shù)體>,如果沒有返回,則不需要“-> 返回類型”

fn main() {
    // 函數(shù)調(diào)用方式
    let return_value = has_return_value(1, 2);
    println!("has_return_value is {}", return_value);
    has_no_return_value(1, 2);
    has_code_block();
    inner_function();
    
    // 函數(shù)嵌套
    fn inner_function() {
        println!("inner_function")
    }
}

// 測試返回值,Rust 中定義函數(shù)如果需要具備參數(shù)必須聲明參數(shù)名稱和類型
fn has_return_value(a: i32, b: i32) -> i32 {
    // 以下三種方式相同
    return a + b;
    // return a + b 不帶分號
    // a + b 不帶分號
}

// 測試沒有返回值
fn has_no_return_value(a: i32, b: i32) {
    println!("has_no_return_value is {}", a + b);
}

// 測試復(fù)雜的表達(dá)式塊
fn has_code_block() {
    let y = {
        let x = 1;
        x + 2 // 表達(dá)式塊{}中的返回表達(dá)式必須不帶分號,不可以使用return關(guān)鍵詞,函數(shù)的任何地方使用了 return 關(guān)鍵詞,就表示函數(shù)結(jié)束
    };

    println!("has_code_block is {}", y);
}

四、流程控制

條件語句

if 語句不僅可以用于條件判斷,還可以作為表達(dá)式返回值

fn main() {
    let a = 12;
    let b;
    // if 語句不需要小括號,Rust 中的條件表達(dá)式必須是 bool 類型
    if a > 0 {
        b = 1;
    } else if a < 0 {
        b = -1;
    } else {
        b = 0;
    }
    println!("b is {}", b);

    // 條件語句賦值
    let x = 3;
    let number = if x > 0 { 1 } else { -1 };
    println!("number 為 {}", number);
}

循環(huán)語句

for 語句通常用于遍歷集合,并且比 while 更安全(避免數(shù)組越界),可以使用 continue 跳過本次迭代,break 終止循環(huán)。
while 語句在滿足條件時執(zhí)行循環(huán),但可能會導(dǎo)致索引越界錯誤
loop 適用于需要手動 break 退出的情況,可以結(jié)合 break 作為表達(dá)式返回值

fn main() {
    // while 循環(huán)
    let mut number = 1;
    while number != 4 {
        println!("{}", number);
        number += 1;
    }

    // for 循環(huán)
    let a = [10, 20, 30, 40, 50];
    // 迭代器訪問
    for i in a.iter() {
        println!("值為 : {}", i);
    }
    // 索引訪問
    for i in 0..5 {
        println!("a[{}] = {}", i, a[i]);
    }

    // loop無限循環(huán)
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    loop {
        let ch = s[i];
        if ch == 'O' {
            break;
        }
        println!("\'{}\'", ch);
        i += 1;
    }
    // loop獲取返回值
    let location = loop {
        let ch = s[i];
        if ch == 'O' {
            // 返回值
            break i;
        }
        i += 1;
    };
    println!(" \'O\' 的索引為 {}", location);
}

五、模式匹配

match 匹配

match 語句必須覆蓋所有可能情況,因此 _ 用于匹配未列出的情況。

fn main() {
    let day = "Monday";
    
    match day {
        "Monday" => println!("新的一周開始了!"),
        "Friday" => println!("周五快樂!"),
        _ => println!("只是普通的一天"),
    }
}

結(jié)構(gòu)體解構(gòu)匹配

struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let point = Point { x: 5, y: -3 };
    
    match point {
        Point { x: 0, y: 0 } => println!("原點"),
        Point { x, y } if y > 0 => println!("({},{}) 位于上半平面", x, y),
        Point { x, y } => println!("點的坐標(biāo): ({},{})", x, y),
    }
}

枚舉匹配

enum TrafficLight {
    Red,
    Yellow,
    Green,
}

fn traffic_light_action(light: TrafficLight) {
    match light {
        TrafficLight::Red => println!("請停車!"),
        TrafficLight::Yellow => println!("準(zhǔn)備起步!"),
        TrafficLight::Green => println!("可以通行!"),
    }
}

fn main() {
    let light = TrafficLight::Green;
    traffic_light_action(light);
}

if let 簡化模式匹配

fn main() {
    let some_value = Some(42);
    
    if let Some(x) = some_value {
        println!("匹配到的值: {}", x);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容