Use generics to create definitions for items like function signatures or structs, which we can then use with many different concrete data types. Defined with <T>

Generics make programming easier without reducing runtime performance.

Generics uses process called Monomorphization where compiler replaces generic placeholders with data types.

struct Language<T, T1, T2>{
    name: T,
    stable_version: T1,
    launched_year: T2
}


fn main{
    let pro_langauge_rust = Language{
        name: String::from("Rust"),
        stable_version: 1.84,
        launched_year: 2012
    };

    println!("Programming language is {:?}", pro_langauge_rust)
}

Output-

Programming language is Language { name: "Rust", stable_version: 1.84, launched_year: 2012 }

Gneneric Method

struct Language<T, T1, T2>{
    name: T,
    stable_version: T1,
    launched_year: T2
}
//struct Color(u8,u8,u8);

impl<T,T1,T2> Language<T, T1, T2> {
    fn get_name(&self) -> &T
    {
        &self.name
    }    
} 

fn main {
   let pro_langauge_rust = Language{
        name: String::from("Rust"),
        stable_version: 1.84,
        launched_year: 2012
    };

    println!("Programming language is {:?}", pro_langauge_rust.get_name())
}

Ouput

Programming language is "Rust"

Loading