Skip to content

Commit

Permalink
Pattern matching add
Browse files Browse the repository at this point in the history
  • Loading branch information
venopyX committed Apr 14, 2024
1 parent 3dea8f4 commit ddb3aa7
Showing 1 changed file with 83 additions and 0 deletions.
83 changes: 83 additions & 0 deletions 11. pattern_matching.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
### 11. Pattern Matching: Unveiling the Magic of Rust's Match Operator

#### Introduction to Pattern Matching

Pattern matching in Rust is like solving a puzzle. It allows you to match the structure of data against patterns you define, enabling powerful and expressive control flow in your code. Whether you're handling enums, tuples, or complex data structures, pattern matching has got you covered.

#### The Basics of Match: Matching Against Patterns

The `match` keyword is Rust's Swiss Army knife for pattern matching. It allows you to match a value against a series of patterns and execute different code blocks based on the match. With `match`, you can handle a wide range of scenarios with elegance and precision.

```rust
let x = 5;
match x {
0 => println!("It's zero!"),
1 | 2 => println!("It's one or two!"),
_ => println!("It's something else!"),
}
```

#### Patterns Galore: From Enums to Structs

Pattern matching shines brightest when dealing with enums and structs. It allows you to destructure complex data types and extract values with ease. Whether you're handling Option types, parsing JSON, or processing network packets, pattern matching is your best friend.

```rust
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}

fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
}
}
}
```

#### Exhaustive Matches and Wildcards: Covering All Bases

Rust's exhaustive pattern matching ensures that you cover all possible cases, leaving no stone unturned. With the `_` wildcard, you can handle any unexpected cases gracefully, preventing bugs and surprises in your code.

```rust
let number = Some(7);
match number {
Some(5) => println!("It's five!"),
Some(_) => println!("It's some other number!"),
None => println!("It's none!"),
}
```

#### Binding and Guard Clauses: Adding Flexibility to Matches

Pattern matching in Rust isn't just about matching; it's about binding and guarding too. With binding, you can extract values from patterns and use them in subsequent code blocks. Guard clauses allow you to add additional conditions to your matches, making them even more powerful.

```rust
let num = Some(7);
match num {
Some(x) if x < 5 => println!("Less than five: {}", x),
Some(x) => println!("Greater than or equal to five: {}", x),
None => println!("It's none!"),
}
```

#### Best Practices

- Use pattern matching to handle complex control flow scenarios with clarity and precision.
- Leverage exhaustive matches to cover all possible cases and prevent unexpected behavior.
- Embrace binding and guard clauses to add flexibility and expressiveness to your matches.

#### Real-World Example

Imagine you're building a chatbot in Rust. You use pattern matching to parse user inputs, match them against predefined patterns, and generate appropriate responses. With pattern matching, your chatbot can handle a wide range of user inputs, from simple greetings to complex queries, with ease and efficiency.

#### Conclusion

Pattern matching is like a secret weapon in your Rust programming arsenal, enabling you to tackle complex control flow scenarios with elegance and clarity. By mastering the art of pattern matching, you'll become a more confident and proficient Rust programmer, capable of solving a wide range of coding puzzles with finesse and flair.

0 comments on commit ddb3aa7

Please sign in to comment.