-
-
Save phaylon/ee6a3572c73089ea9a5fca3b00f19a55 to your computer and use it in GitHub Desktop.
Match Ergonomics Issue C: Semantic Convention Enforcement
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![allow(dead_code, unused, unreachable_patterns)] | |
enum State { | |
CaseCopy { v: i32 }, | |
CaseSingle { v: Vec<i32> }, | |
CaseMulti { v1: Vec<i32>, v2: Vec<i32> }, | |
CaseComplex { flag: bool, v1: Vec<i32>, v2: Vec<i32> }, | |
} | |
fn handle(state: &mut State) { | |
// cases following convention | |
match *state { | |
State::CaseCopy { v } => println!("copied something out"), | |
State::CaseSingle { ref v } => println!("not mutating the v"), | |
State::CaseSingle { ref mut v } => println!("actually mutatint the v"), | |
State::CaseMulti { ref mut v1, ref v2 } => println!("only mutating one of them"), | |
State::CaseComplex { flag: true, ref mut v1, ref v2 } => println!("mut first"), | |
State::CaseComplex { flag: false, ref v1, ref mut v2 } => println!("mut second"), | |
} | |
// not following convention | |
// accidental mutation is hard to discover | |
match state { | |
State::CaseSingle { v } => println!("not actually copying out"), | |
State::CaseMulti { v1, v2 } => println!("also not copying out"), | |
_ => (), | |
} | |
// following convention with accidental mutation | |
match state { | |
// if you only expected one mutation, the second one is easier to notice | |
State::CaseMulti { ref mut v1, ref mut v2 } => println!("accidentally mutate both"), | |
_ => (), | |
} | |
} | |
fn main() { | |
let mut state = State::CaseCopy { v: 23 }; | |
handle(&mut state); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment