/// In types_avances we introduce `Enums` (also known as `Algebraic Data Types`), `Pattern Matching`,
/// associated functions and methods.
enum NumberOrNothing {
Nothing,
Number(i32),
}
impl NumberOrNothing {
fn new(val: i32) -> Self {
NumberOrNothing::Number(val)
}
// Method (takes `self`)
fn print(self) {
match self {
NumberOrNothing::Nothing => println!("No number."),
NumberOrNothing::Number(val) => println!("The number is: {}", val),
}
}
}
const SIZE: usize = 9;
fn read_command_line() -> [i32; SIZE] {
[10, 32, 12, 43, 52, 53, 83, 2, 9]
}
// Prints tab and returns tab.
// Tab would be destructed at the end of the function otherwise.
fn print_tab(tab: [i32; SIZE]) {
for t in tab {
print!("{} ", t);
}
println!();
}
fn min_i32(lhs: i32, rhs: i32) -> i32 {
if lhs < rhs { lhs } else { rhs }
}
fn find_min(tab: [i32; SIZE]) -> NumberOrNothing {
let mut min = NumberOrNothing::Nothing;
for t in tab {
match min {
NumberOrNothing::Nothing => min = NumberOrNothing::new(t),
NumberOrNothing::Number(val) => min = NumberOrNothing::new(min_i32(val, t)),
}
}
min
}
fn main() {
let tab = read_command_line();
println!("Among the numbers in the list:");
print_tab(tab);
let min = find_min(tab);
min.print();
}