AnyCompiler

Generics

Ek generic function ek aise type ke sath kaam karta hai jo call site par decide hota hai, define hone par nahi. T: PartialOrd + Copy, T ko un types tak restrict karta hai jinhe compare aur copy kiya ja sakta hai — bilkul wahi jo largest ko kaam karne ke liye chahiye, aur kuch nahi.

fn largest<T: PartialOrd + Copy>(items: &[T]) -> T {
    let mut largest = items[0];
    for &item in items {
        if item > largest {
            largest = item;
        }
    }
    largest
}

fn main() {
    let numbers = vec![10, 25, 3, 47, 8];
    println!("largest number: {}", largest(&numbers));

    let chars = vec!['y', 'm', 'a', 'q'];
    println!("largest char: {}", largest(&chars));
}
Output
largest number: 47
largest char: y

Generic structs

Structs bhi generic ho sakte hain — Point<T> kisi bhi type T ke liye kaam karta hai, jahan dono fields same type share karte hain. impl block ka apna T: std::fmt::Display bound sirf describe par apply hota hai, isliye Point khud un types ke sath bhi usable rehta hai jo display nahi ki ja sakti.

struct Point<T> {
    x: T,
    y: T,
}

impl<T: std::fmt::Display> Point<T> {
    fn describe(&self) -> String {
        format!("({}, {})", self.x, self.y)
    }
}

fn main() {
    let int_point = Point { x: 3, y: 4 };
    let float_point = Point { x: 1.5, y: 2.5 };

    println!("{}", int_point.describe());
    println!("{}", float_point.describe());
}
Output
(3, 4)
(1.5, 2.5)

Aage: error handling — ? se Result ko propagate karna, aur ek custom error type likhna.

Practice Exercise

Ek generic function first<T: Copy>(items: &[T]) -> T likho jo slice ka pehla item return kare, phir first(&[10, 20, 30]) print karo.