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 的設計思維。