iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Rust

Rust 30 天養成計畫:從零到 CLI 專案系列 第 10

Day 10:Tuple 與 Struct

  • 分享至 

  • xImage
  •  

1. Tuple(元組)
元組是一組可以包含不同型別的資料集合,使用小括號 ()。可以用索引存取元素,或是解構 (destructuring)。

fn main() {
    let tup: (i32, f64, &str) = (500, 6.4, "hello");

    // 用索引存取
    println!("tup.0 = {}, tup.1 = {}, tup.2 = {}", tup.0, tup.1, tup.2);

    // 解構
    let (x, y, z) = tup;
    println!("x = {}, y = {}, z = {}", x, y, z);
}

輸出:

tup.0 = 500, tup.1 = 6.4, tup.2 = hello
x = 500, y = 6.4, z = hello

2. Struct(結構體)
Struct 可以更有意義地為資料命名,分為三種形式:一般結構、tuple 結構、單元結構。

  • 一般結構
struct Person {
    name: String,
    age: u8,
}
fn main() {
    let p1 = Person {
        name: String::from("Alice"),
        age: 30,
    };
    println!("{} is {} years old", p1.name, p1.age);
}

輸出:

Alice is 30 years old
  • Tuple Struct(元組結構)
    沒有欄位名稱,類似 tuple,但有型別名稱可區分。
struct Color(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    println!("({}, {}, {})", black.0, black.1, black.2);
}

輸出:

(0, 0, 0)
  • Unit-like Struct(單元結構)
    沒有欄位,常用於需要型別但不需要資料的情境。
struct Marker;

fn main() {
    let _m = Marker;
}

3. Struct 與函數搭配
通常會為 struct 寫建構函數,並透過借用(&)來避免所有權轉移:

struct Rectangle {
    width: u32,
    height: u32,
}

// 這裡參數用 &Rectangle,而不是直接 Rectangle
// 因為我們只需要讀取資料,不需要拿走所有權
fn area(rect: &Rectangle) -> u32 {
    rect.width * rect.height
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };
    println!("The area is {}", area(&rect));
    // rect 在這裡仍然可用,因為只是借用
    println!("Rectangle is {}x{}", rect.width, rect.height);
}

輸出:

The area is 1500
Rectangle is 30x50

4. 學習心得與補充
今天學到的 tuple 和 struct 讓我感覺 Rust 在資料組織上設計得很靈活。Tuple 適合快速打包不同型別的值,但要用 .0、.1 來取值有點抽象,如果數據有意義,通常會改用 struct。struct 能替每個欄位命名,讓資料更清楚。這讓我想到前幾天在用變數和函數參數時,如果數值多起來會搞混,但有了 struct 就能把相關的資料包在一起,讓程式更有結構。Tuple struct 和單元結構則提供了更多特殊用法,雖然現在還沒有遇到必須用 tuple struct 或單元結構的情況,但我覺得知道它們的存在很重要,因為它們讓 Rust 的型別系統更靈活,也幫我建立了資料要怎麼被組織起來的不同思考方式。


上一篇
Day 9:字串 (String) 與 &str 的差異
下一篇
Day 11:Struct 的方法與關聯函數
系列文
Rust 30 天養成計畫:從零到 CLI 專案13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言