Sto usando Rust 1.15.1 e, recentemente, mi sono imbattuto in un problema per il quale non sono riuscito a trovare una soluzione immediata.
Quando si guardano gli esempi usando la corrispondenza dei pattern, solitamente distruggono l'oggetto nell'espressione della corrispondenza e continuano a lavorare con i membri all'interno di quell'oggetto. Tuttavia, mi piacerebbe NON distruggerlo, ma combaciare solo con esso e inviare l'oggetto completo (usando la semantica del movimento) a una delle tante altre funzioni a seconda delle sue proprietà.
Il seguente codice funziona e fa esattamente ciò di cui ho bisogno. Tuttavia, ho bisogno di introdurre un tipo enum "artificiale" e una seconda espressione di corrispondenza. Mi chiedo se esiste una soluzione più semplice e più semplice?
#[derive(Debug)]
enum Number {
Constant { value: i32 },
}
fn process_even(n: Number) {
println!("even: {:?}", n);
}
fn process_odd(n: Number) {
println!("odd: {:?}", n);
}
fn process(n: Number) {
enum Action {
ProcessEven,
ProcessOdd,
}
let action = match n {
Number::Constant { value: c, .. } if 0 == c % 2 => Action::ProcessEven,
_ => Action::ProcessOdd,
};
match action {
Action::ProcessEven => process_even(n),
Action::ProcessOdd => process_odd(n),
}
}
fn main() {
process(Number::Constant { value: 4711 });
process(Number::Constant { value: 2000 });
}