Day 1:泛型函式與結構
學習目標
- 寫出泛型函式與結構
- 理解型別參數
<T>
- 用 trait bound 限制泛型
今日重點
泛型函式
// 泛型 + PartialOrd trait bound(可比較大小)
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in &list[1..] {
if item > largest {
largest = item;
}
}
largest
}
fn main() {
let numbers = vec![34, 50, 25, 100, 65];
println!("{}", largest(&numbers)); // 100
let chars = vec!['y', 'm', 'a', 'q'];
println!("{}", largest(&chars)); // y
}
泛型結構
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn new(x: T, y: T) -> Self {
Point { x, y }
}
}
// 只為特定型別實作方法
impl Point<f64> {
fn distance_from_origin(&self) -> f64 {
(self.x.powi(2) + self.y.powi(2)).sqrt()
}
}
fn main() {
let ip = Point::new(5, 10); // Point<i32>
let fp = Point::new(1.0, 4.0); // Point<f64>
println!("{}", fp.distance_from_origin());
}
練習
fn max_of<T: PartialOrd>(a: T, b: T) -> T {
if a >= b { a } else { b }
}
// 1. 寫一個 generic function 取兩值較大者
// 2. 寫成泛型 struct Pair<T> 存兩個值,並加一個方法 first()
自我檢查
深入連結
- The Book 第 10 章「Generic Data Types」