隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年12月23日 星期六

Rust 元組(Tuple)、數組(Array)、結構(struct)差別


元組(Tuple)、數組(Array)、結構(struct)差別

Rust儲存數據方法有三種

分別是元組(tuple)、數組(Array)、結構(struct)

而數組分為兩種

一種是靜態數組(Array)

另一種是動態數組(Vector)


元組[1]

元組是一個集合

集合裡面可以放不同的形態(type)

例如

fn main() {
    let data: (i32, f64, bool, &str, String)
                = (0, 1.0, true, "abc", "String".to_string());
    println!("{}", data.0);
    println!("{}", data.1);
    println!("{}", data.2);
    println!("{}", data.3);
    println!("{}", data.4);
}
0 1 true abc String



數組

數組的特色就是整個數據型態都會一樣

數組分為兩個

一個是靜態數組

另一個是動態數組


靜態數組[2]

靜態數組指的是不能增加它的大小

他所有的數據型態是固定的

總量也是固定的

fn main() {
    let data: [i32;5] = [0, 1, 2, 3, 4];
    println!("{}", data[0]);
    println!("{}", data[1]);
    println!("{}", data[2]);
    println!("{}", data[3]);
    println!("{}", data[4]);
}
0 1 2 3 4


動態數組[3]

動態數組則是可以對他裡面的內容刪減

最簡單就是push可以增加一個數據

fn main() {
    let mut data: Vec<i32>= vec![0, 1, 2, 3, 4];
    println!("{}", data[0]);
    println!("{}", data[1]);
    println!("{}", data[2]);
    println!("{}", data[3]);
    println!("{}", data[4]);
    data.push(5);
    println!("{}", data[5]);
}
0 1 2 3 4 5


元組和數組比較

兩個差別就是型態

元組裡面元素型態不一定要一樣

而數組則是要一定

如果是和靜態數組比較

他們都一樣不能增減數據


結構應用[4]

但與其使用元組

我會比較偏向使用結構

因為使用元組的時候

要記得data.0 data.1 data.2是什麼數據

有時候數據比較長就會忘記

而結構則是可以取名字

例如

struct Data {
    row: u8,
    col: u8,
}

fn main() {
    let data = Data{
        row: 0,
        col: 1,
    };
    println!("{}", data.row);
    println!("{}", data.col);
}
0 1

我創建一個名為Data的結構

裡面有兩個數據 row和col

現在只有兩個可能會很好記,使用元組和結構可能差異不大

但如果像這個很長一條

#[derive(Debug)]
enum Semester {
    First,
    Second,
    Third,
    Forth,
}
#[derive(Debug)]
struct Score {
    semester: Semester,
    name: String,
    subject: String,
    score: Vec<u8>,
    average: f32,
    bouns: bool,
    flunk: bool,
    comments: String,
}
fn main() {
    let data = Score {
        semester: Semester::First,
        subject: String::from("Chinese"),
        score: vec![10, 20, 30],
        average: 20.0,
        bouns: false,
        flunk: true,
        comments: String::from("He is a good student. But see you next year."),
        name: String::from("Lagee")
    };
    println!("{}", data.name);
    println!("{:#?}", data);
}

整個結構出現學期、名字、科目、分數、平均、是否加分、是否當掉、評語

甚至用上了枚舉(Enum[5])

在這種情況下使用元組就會忘記每個位置是什麼

但結構甚至可以忘記添加資料時

就像程式碼最後才補上name

而輸出只需要打後面名字,不用記位置

結構也會自動整理

Lagee
Score {
    semester: First,
    name: "Lagee",
    subject: "Chinese",
    score: [
        10,
        20,
        30,
    ],
    average: 20.0,
    bouns: false,
    flunk: true,
    comments: "He is a good student. But see you next year.",
}

整個輸出就一目了然


總結

  • 元組和靜態數組都不能增加大小,動態數組可以
  • 元組內型態可以不一樣,數組都要一樣
  • 相較於使用元組,我更喜歡用結構,因結構可以對每個元素命名,以方便存取使用


參考資料

[1] https://doc.rust-lang.org/rust-by-example/primitives/tuples.html

[2] https://doc.rust-lang.org/std/primitive.array.html

[3] https://doc.rust-lang.org/std/vec/struct.Vec.html

[4] https://doc.rust-lang.org/book/ch05-01-defining-structs.html

[5] https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html

0 comments:

張貼留言