Generics and trait bounds
Generics in Rust are a way to write flexible, reusable, and type-safe code. They allow you to define functions, structs, enums, or methods that can operate on different types of data, without knowing the exact types ahead of time. Instead of specifying a concrete type, you can use a placeholder that will be replaced by a specific type when the code is compiled.
Create a first_element
function
pub fn main() { let v = vec![1, 2, 3]; let v2 = vec![String::from("Harkirat"), String::from("Singh")]; let v3 = vec![1.0, 2.0, 3.0]; println!("{}", first_element(v).unwrap()); println!("{}", first_element(v2).unwrap()); println!("{}", first_element(v3).unwrap());}
fn first_element<T>(v: Vec<T>) -> Option<T> { return v.into_iter().nth(0);}
Create a does_exist
function (trait bound)
pub fn main() { let v = vec![1, 2, 3]; let v2 = vec![String::from("Harkirat"), String::from("Singh")]; let v3 = vec![1.0, 2.0, 3.0]; println!("{}", first_element(v.clone()).unwrap()); println!("{}", first_element(v2).unwrap()); println!("{}", first_element(v3).unwrap());
println!("{}", does_exist(v, 1));}
fn first_element<T>(v: Vec<T>) -> Option<T> { return v.into_iter().nth(0);}
fn does_exist<T: std::cmp::PartialEq>(v: Vec<T>, element: T) -> bool { let mut iter = v.iter(); while let Some(value) = iter.next() { if *value == element { return true; } } return false;}
Create a biggest_element
function
fn biggest_element<T: Ord>(a: T, b: T) -> T { if a > b { return a; } return b;}
Create a print_variable
function
use std::fmt::Display;
fn print_variable<T: Display>(a: T) { println!("{}", a);}