// โโ Irrefutable patterns โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
fn irrefutable() {
let x = 42; // simple variable
let (a, b, c) = (1, 2, 3); // tuple
struct P { x: f64, y: f64 }
let P { x, y } = P { x: 1.0, y: 2.0 }; // struct
fn add((a,b): (i32,i32)) -> i32 { a+b } // irrefutable param
let pairs = vec![(1,'a'),(2,'b')];
for (n, ch) in &pairs { println!("{}{}", n, ch); } // irrefutable for
println!("{} {} {} {} {} {}", x, a, b, c, add((3,4)), y+x);
}
// โโ Refutable patterns โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
fn refutable() {
let opt: Option<i32> = Some(42);
// if let โ OK, refutable
if let Some(v) = opt { println!("Some({})", v); }
// match โ OK, refutable
match opt { Some(v) => println!("match {}", v), None => {} }
// while let โ OK, refutable
let mut s = vec![1,2,3];
while let Some(t) = s.pop() { print!("{} ", t); } println!();
// This FAILS to compile (uncomment to see error):
// let Some(v) = opt; // ERROR: refutable pattern in local binding
}
fn main() { irrefutable(); refutable(); }
#[cfg(test)]
mod tests {
#[test] fn irr_tuple() { let (a,b) = (10,20); assert_eq!(a+b, 30); }
#[test] fn irr_struct() {
struct F { x: i32 }
let F { x } = F { x: 42 }; assert_eq!(x, 42);
}
}
(* Irrefutable vs refutable in OCaml *)
let () =
(* Irrefutable let bindings *)
let (a, b) = (1, 2) in
Printf.printf "a=%d b=%d\n" a b;
(* Irrefutable function param *)
let add (x,y) = x+y in
Printf.printf "add=%d\n" (add (3,4));
(* Refutable โ requires match *)
let opt = Some 42 in
(match opt with Some v->Printf.printf "got %d\n" v | None->());
(* OCaml warns if you do: let Some v = opt *)
(* That pattern is "non-exhaustive" โ use match instead *)
()