Rust
Destructuring
Learn tuple and struct destructuring.
Destructuring
Patterns can nest: a struct inside a tuple, a tuple inside an enum... A single pattern unpacks a complex value in one go:
enum Olay {
Tik { konum: (i32, i32) },
Tus(char),
}
match olay {
Olay::Tik { konum: (x, y) } => println!("tık {x},{y}"),
Olay::Tus(c) => println!("tuş {c}"),
}
let ((a, b), Nokta { x, .. }) = ((1, 2), Nokta { x: 5, y: 9 });
let, function parameters and for loops accept patterns too: fn f(&(a, b): &(i32, i32)), for (i, (ad, puan)) in liste.iter().enumerate().
Unpacking in a loop
Patterns make working with collections of pairs and nested structures very readable:
let puanlar = vec![("ece", (90, 85)), ("can", (70, 95))];
for (ad, (vize, final_)) in &puanlar {
let ort = (vize + final_) / 2;
println!("{ad}: {ort}");
}
Since final is reserved as a keyword, the variable name is written final_ (or r#final).
Exercise Handle events
Write the Olay enum above. Loop over a vector containing Olay::Tik { konum: (3, 4) } and Olay::Tus('a'), unpacking each event with nested patterns, and print each on its own line.
Show example solution
enum Olay {
Tik { konum: (i32, i32) },
Tus(char),
}
fn main() {
let olaylar = vec![Olay::Tik { konum: (3, 4) }, Olay::Tus('a')];
for olay in &olaylar {
match olay {
Olay::Tik { konum: (x, y) } => println!("tık {},{}", x, y),
Olay::Tus(c) => println!("tuş {}", c),
}
}
}
Test yourself
-
Which patterns can be used with <code>let</code>?
- Only identifiers
- Only tuples
- Irrefutable patterns that fit every value (tuples, structs). let-else for others
- Every pattern
Show answer
Irrefutable patterns that fit every value (tuples, structs). let-else for others — let Some(x) = v; doesn't compile because it doesn't cover None; write let Some(x) = v else { .. };.
-
Nested unpacking
match olay {
Olay::Tik { konum: ____ } => println!("tık {x},{y}"),
Olay::Tus(c) => println!("tuş {c}"),
}
Show answer
match olay {
Olay::Tik { konum: (x, y) } => println!("tık {x},{y}"),
Olay::Tus(c) => println!("tuş {c}"),
}
-
Pattern and what it binds
- ((a, b), _)
- a, b
- Olay::Tik { konum: (x, y) }
- x, y
- Nokta { x, .. }
- Only x
- (ad, (vize, final_))
- Three variables
Next lesson: @ binding