// Rust generics map to Nim's, which are instantiated structurally at the call // site much as Rust's are. Trait bounds and `where` clauses are dropped: an // operation the bound permitted either exists for the instantiated type or is // a compile error at that instantiation, so dropping it cannot change what an // accepted program means. #[derive(Copy, Clone)] struct Pair { a: T, b: T, } enum Holder { Empty, One(T), } impl Pair { fn first(&self) -> T { self.a } fn swapped(&self) -> Pair { Pair { a: self.b, b: self.a } } } fn largest(xs: &[T]) -> T { let mut m: T = xs[0]; for x in xs.iter() { if *x > m { m = *x; } } m } fn count(h: &Holder) -> i32 { match h { Holder::Empty => 0, Holder::One(_) => 1, } } fn main() { let p: Pair = Pair { a: 1, b: 2 }; let q: Pair = p.swapped(); println!("{} {} {}", q.a, q.b, p.first()); let f: Pair = Pair { a: 1.5, b: -0.5 }; println!("{} {}", f.swapped().a, f.first()); let v: Vec = vec![3, 9, 4]; println!("{}", largest(&v)); let w: Vec = vec![1.5, 0.25, 9.75]; println!("{}", largest(&w)); let b: Vec = vec![7, 200, 3]; println!("{}", largest(&b)); let h: Holder = Holder::One(7); let e: Holder = Holder::Empty; println!("{} {}", count(&h), count(&e)); match h { Holder::Empty => println!("empty"), Holder::One(v) => println!("one {}", v), } }