iT邦幫忙

2025 iThome 鐵人賽

DAY 15
0
Rust

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

Day 15:泛型 (Generics)

  • 分享至 

  • xImage
  •  

1. 為什麼需要泛型
Rust 的泛型目的是讓函數或型別能夠重複使用,而不用為每一種型別都重寫一份程式碼。這能讓程式更簡潔、可重用,例如要寫一個找最大值的函數,如果沒有泛型,就得分別為 i32、char 各寫一份程式碼,泛型能幫我們統一處理。

2. 函數中的泛型
泛型最常見的例子是寫一個找最大值的函數,可以套用在整數或字元。

fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];
    for item in list {
        if item > largest {
            largest = item;
        }
    }
    largest
}

fn main() {
    let numbers = vec![10, 20, 5, 30];
    let chars = vec!['a', 'y', 'z', 'm'];

    println!("largest number = {}", largest(&numbers));
    println!("largest char = {}", largest(&chars));
}

輸出:

largest number = 30
largest char = z

3. Struct 中的泛型
泛型也能應用在結構體:

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let int_point = Point { x: 5, y: 10 };
    let float_point = Point { x: 1.2, y: 3.4 };

    println!("int_point = ({}, {})", int_point.x, int_point.y);
    println!("float_point = ({}, {})", float_point.x, float_point.y);
}

輸出:

int_point = (5, 10)
float_point = (1.2, 3.4)

4. Enum 中的泛型
之前學到的 Option和 Result本身就是泛型 enum。

enum Option<T> {
    Some(T),
    None,
}

enum Result<T, E> {
    Ok(T),
    Err(E),
}

5. 方法中的泛型
在 impl 區塊中也能使用泛型。

struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

fn main() {
    let p = Point { x: 10, y: 20 };
    println!("p.x = {}", p.x());
}

輸出:

p.x = 10

6. 學習心得與補充
今天學到的泛型讓我馬上想到前幾天學的 Option 和 Result,因為它們其實就是泛型 enum 的應用。以前在 C++ 用過 template,雖然能泛化型別,但有時候報錯訊息很複雜,Rust 則是加上 trait bound讓泛型使用時更明確也更安全。我覺得泛型最大的好處是能讓我用同一份程式碼處理不同型別,寫起來省事又有一致性。雖然剛開始要適應 的語法,但練習後發現其實概念很直觀,也幫助我更理解 Rust 的設計思維。


上一篇
Day 14:Result 與錯誤處理
下一篇
Day 16:Trait(特徵)
系列文
Rust 30 天養成計畫:從零到 CLI 專案18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言