Rust by Example | страница 35
>// Could `match` 1 ..= 12 directly but then what age
>// would the child be? Instead, bind to `n` for the
>// sequence of 1 ..= 12. Now the age can be reported.
>n @ 1 ..= 12 => println!("I'm a child of age {:?}", n),
>n @ 13 ..= 19 => println!("I'm a teen of age {:?}", n),
>// Nothing bound. Return the result.
>n => println!("I'm an old person of age {:?}", n),
>}
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
You can also use binding to "destructure" enum variants, such as Option:
>fn some_number() -> Option
>Some(42)
>}
>fn main() {
>match some_number() {
>// Got `Some` variant, match if its value, bound to `n`,
>// is equal to 42.
>Some(n @ 42) => println!("The Answer: {}!", n),
>// Match any other number.
>Some(n) => println!("Not interesting... {}", n),
>// Match anything else (`None` variant).
>_ => (),
>}
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
For some use cases, when matching enums, match is awkward. For example:
>#![allow(unused)]
>fn main() {
>// Make `optional` of type `Option
>let optional = Some(7);
>match optional {
>Some(i) => {
>println!("This is a really long string and `{:?}`", i);
>// ^ Needed 2 indentations just so we could destructure
>// `i` from the option.
>},
>_ => {},
>// ^ Required because `match` is exhaustive. Doesn't it seem
>// like wasted space?
>};
>}
if let is cleaner for this use case and in addition allows various failure options to be specified:
>fn main() {
>// All have type `Option
>let number = Some(7);