Выражения Rust match
намного мощнее, чем операторы Java switch
, и вы можете сделать намного больше, чем просто сопоставление чисел.
В частности, оно поддерживает сопоставление с шаблоном который позволяет вам сопоставлять фрагменты ваших данных, исходя из их структуры или значений, которые он содержит.Когда у вас есть более сложные шаблоны для сопоставления, важно иметь возможность указать порядок, потому что шаблоны могут перекрываться.Например:
let value = Some((Some(3), "hello"));
let s = match value {
None => "Nothing there!".to_owned(),
Some((Some(3), _)) => "The number is exactly 3!".to_owned(),
Some((Some(n), _)) if n > 3 => format!("Got a number bigger than 3: {}", n),
Some((None, msg)) => format!("Message with no number: {}", msg),
Some((_, msg)) => format!("Got the message, ignore the rest: {}", msg),
_ => "Anything else?".to_owned()
};
println!("result = {}", s);
Последний случай здесь фактически невозможен, потому что все остальные ветви охватывают все.Компилятор выдаст предупреждение, если это не то, что вы хотели.