Day 2:泛型中的多重型別與性能

學習目標

  • 使用多個型別參數 <T, U>
  • 理解泛型的「零成本抽象」
  • 知道核心 trait bound 的類別

今日重點

多個型別參數

struct Pair<T, U> {
    x: T,
    y: U,
}

fn main() {
    let p = Pair { x: 5, y: "hello" };   // Pair<i32, &str>
}

泛型是零成本抽象(讀懂這段)

Rust 泛型採「單態化(monomorphization)」:編譯時為每個實際使用的型別產生一份專門的程式碼。執行期沒有額外成本;你的程式看起來寫一次,實際依型別展開多次。

常見 trait bound 分類

Trait 用途
PartialOrd / Ord 比較大小 / 排序
PartialEq / Eq 相等比較
Clone 深拷貝
Copy 簡單複製(如整數)
Debug {:?} 格式化
Display {} 格式化

trait bound 語法

// 方式一:inline
fn f<T: Clone + Debug>(x: T) {}

// 方式二:where(更易讀)
fn g<T>(x: T)
where
    T: Clone + Debug,
{}

練習

#[derive(Debug, Clone)]
struct Kit<T> {
    items: Vec<T>,
}

impl<T: Clone> Kit<T> {
    fn add(&mut self, item: T) {
        self.items.push(item);
    }
    fn clone_items(&self) -> Vec<T> {
        self.items.clone()
    }
}
1. 為什麼 clone_items 需要 T: Clone bound? 2. 試試不加 bound 會發生什麼編譯錯誤。

自我檢查

  • 會用多個型別參數
  • 理解單態化和「零成本」的意義
  • 認識常見核心 trait
  • 會用 where 子句提升可讀性

深入連結

  • The Book 第 10 章「Performance of Code Using Generics」