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()
}
}
clone_items 需要 T: Clone bound?
2. 試試不加 bound 會發生什麼編譯錯誤。
自我檢查
- 會用多個型別參數
- 理解單態化和「零成本」的意義
- 認識常見核心 trait
- 會用 where 子句提升可讀性
深入連結
- The Book 第 10 章「Performance of Code Using Generics」