Generics
Monomorphization is a process where the compiler replaces generic placeholders with concrete datatypes.
Generics are a way to make a function or a type work for multiple types to avoid code duplication.
- Doesn't affect Runtime Performance.
- Generics are a zero-cost abstraction.
- Make Programming easier without reducing runtime performance.
use std::fmt::Debug;
use std::fmt::Display;
use std::ops::*;
fn main() {
//i32
let n1: i32 = 10;
let n2: i32 = 20;
print_this(n1, n2);
println!("Adding i32 ( {} + {} ) = {}", n1,n2, add_values(n1, n2));
println!("Subtracting i32 ( {} from {} ) = {}", n1,n2,sub_values(n1, n2));
println!("-----------------------------------");
// F64
let t1 = 23.45;
let t2 = 34.56;
print_this(t1, t2);
println!("Adding f64 ( {} + {} ) = {}", t1,t2, add_values(t1, t2));
println!("Subtracting f64 ( {} from {} ) = {}", t1,t2,sub_values(t1, t2));
println!("-----------------------------------");
// &str
let r1 = "Rachel";
let r2 = "Green";
print_this(r1, r2);
println!("----------------");
// String Object
let s1 = String::from("Rachel");
let s2 = String::from("Green");
print_this(s1, s2);
println!("----------------");
//printing diff datatypes
print_another(t1,n1);
}
fn print_this<T: Debug + Display>(p1: T, p2: T) -> () {
println!("Printing - {:?},{}", p1, p2)
}
fn add_values<T: Add<Output = T>>(p1: T, p2: T) -> T {
// ://doc.rust-lang.org/std/ops/index.html
p1 + p2
}
fn sub_values<T: Sub<Output = T>>(p1: T, p2: T) -> T {
p1 - p2
}
fn print_another<T: Debug + Display, U:Debug + Display>(p1: T, p2: U) -> () {
println!("Printing Diff Datatypes - {:?},{}", p1, p2)
}
Generics with Struct
// Generics with Struct
struct Sample<T, U, V> {
a: T,
b: U,
c: V
}
fn main() {
let var1 = Sample{ a: 43.10, b: 2, c:"Hello" };
println!("A: {}", var1.a);
println!("B: {}", var1.b);
println!("C: {}", var1.c);
println!("----------------");
let var2 = Sample{ a: "Hello", b: "World", c:34.6 };
println!("A: {}", var2.a);
println!("B: {}", var2.b);
println!("C: {}", var2.c);
}