A `match` expression selects an arm based on a value. With enums, each arm handles a variant; an arm can also bind data carried by that variant. section 2.5.1
Listing 2.25 Using match expressions with enums
enum FizzBuzzValue {
Fizz,
Buzz,
FizzBuzz,
NotDivisible,
}
fn main() {
for i in 1..101 {
print_fizzbuzz(i);
}
}
fn print_fizzbuzz(x: i32) {
match fizzbuzz(x) {
FizzBuzzValue::FizzBuzz => { #1
println!("FizzBuzz");
}
FizzBuzzValue::Fizz => {
println!("Fizz");
}
FizzBuzzValue::Buzz => {
println!("Buzz");
}
FizzBuzzValue::NotDivisible => {
println!("{}", x);
}
}
}
fn fizzbuzz(x: i32) -> FizzBuzzValue {
if x % 3 == 0 && x % 5 == 0 {
FizzBuzzValue::FizzBuzz
} else if x % 3 == 0 {
FizzBuzzValue::Fizz
} else if x % 5 == 0 {
FizzBuzzValue::Buzz
} else {
FizzBuzzValue::NotDivisible
}
}
This FizzBuzz example matches each enum variant to the output it should print. section 2.5.1
Listing 2.26 FizzBuzzValue enum holding a number not divisible by 3 or 5
enum FizzBuzzValue {
Fizz,
Buzz,
FizzBuzz,
NotDivisible(i32), #1
}
fn main() {
for i in 1..101 {
print_fizzbuzz(i);
}
}
fn print_fizzbuzz(x: i32) {
match fizzbuzz(x) {
FizzBuzzValue::FizzBuzz => {
println!("FizzBuzz");
}
FizzBuzzValue::Fizz => {
println!("Fizz");
}
FizzBuzzValue::Buzz => {
println!("Buzz");
}
FizzBuzzValue::NotDivisible(num) => { #2
println!("{}", num);
}
}
}
fn fizzbuzz(x: i32) -> FizzBuzzValue {
if x % 3 == 0 && x % 5 == 0 {
FizzBuzzValue::FizzBuzz
} else if x % 3 == 0 {
FizzBuzzValue::Fizz
} else if x % 5 == 0 {
FizzBuzzValue::Buzz
} else {
FizzBuzzValue::NotDivisible(x) #3
}
}
The `NotDivisible(num)` arm shows how a match can bind a value carried by an enum variant. section 2.5.1
A match can also produce a value: matching a `Result` can extract `Ok` data or return early from the function on `Err`. section 2.5.4

