Tuple elements may have side-effects, and some of them may depend on others. Consider this program:
fn main() {
let mut v = vec![1, 2];
match (v.pop(), v.pop()) {
(Some(z), Some(y)) => println!("y = {}, z = {}", y, z),
_ => unreachable!(),
}
}
Does it output y = 1, z = 2
or y = 2, z = 1
? A few rounds on the Rust Playground suggests the former on stable 1.32.0, but maybe it would change if I ran it more times, recompiled the compiler, changed compiler versions, etc.
Is there a documented commitment or at least intention to maintain a particular order of evaluation for tuples (e.g. depth-first and left-to-right)?
rg "match \(.*,.*\(\)"
turned up some examples including this match in src/libserialize/json.rs. – Moorman