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()

自我檢查

  • 能寫泛型函式 <T: Trait>
  • 能定義泛型結構與 impl
  • 知道何時用 impl<T> vs impl Point<f64>(只對特定型別實作)

深入連結

  • The Book 第 10 章「Generic Data Types」