Skip to content

Commit

Permalink
Add slide reviewing irrefutable patterns (#2608)
Browse files Browse the repository at this point in the history
  • Loading branch information
randomPoison authored Feb 6, 2025
1 parent 28ab749 commit 553e3c5
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@

- [Welcome](welcome-day-2.md)
- [Pattern Matching](pattern-matching.md)
- [Irrefutable Patterns](pattern-matching/infallible.md)
- [Matching Values](pattern-matching/match.md)
- [Destructuring Structs](pattern-matching/destructuring-structs.md)
- [Destructuring Enums](pattern-matching/destructuring-enums.md)
Expand Down
66 changes: 66 additions & 0 deletions src/pattern-matching/infallible.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
minutes: 5
---

# Irrefutable Patterns

In day 1 we briefly saw how patterns can be used to _destructure_ compound
values. Let's review that and talk about a few other things patterns can
express:

```rust,editable
fn takes_tuple(tuple: (char, i32, bool)) {
let a = tuple.0;
let b = tuple.1;
let c = tuple.2;
// This does the same thing as above.
let (a, b, c) = tuple;
// Ignore the first element, only bind the second and third.
let (_, b, c) = tuple;
// Ignore everything but the last element.
let (.., c) = tuple;
}
fn main() {
takes_tuple(('a', 777, true));
}
```

<details>

- All of the demonstrated patterns are _irrefutable_, meaning that they will
always match the value on the right hand side.

- Patterns are type-specific, including irrefutable patterns. Try adding or
removing an element to the tuple and look at the resulting compiler errors.

- Variable names are patterns that always match and which bind the matched value
into a new variable with that name.

- `_` is a pattern that always matches any value, discarding the matched value.

- `..` allows you to ignore multiple values at once.

## More to Explore

- You can also demonstrate more advanced usages of `..`, such as ignoring the
middle elements of a tuple.

```rust
fn takes_tuple(tuple: (char, i32, bool, u8)) {
let (first, .., last) = tuple;
}
```

- All of these patterns work with arrays as well:

```rust
fn takes_array(array: [u8; 5]) {
let [first, .., last] = array;
}
```

</details>

0 comments on commit 553e3c5

Please sign in to comment.