-
Notifications
You must be signed in to change notification settings - Fork 533
if let
guards documentation
#1823
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
65337a7
to
e704b43
Compare
```rust,ignore | ||
match expression { | ||
pattern if let subpattern = guard_expr => arm_body, | ||
... | ||
} | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would it be possible to make a working example?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Im not really sure, because it's not stable feature and contains behind #![feature...]
gate that's aren't allowed in documentation and CI will fail with this error
Running target/debug/style-check ../src
error in ../src/expressions/match-expr.md: #![feature] attributes are not allowed
* The `if let` guard may refer to variables bound by the outer match pattern. | ||
* New variables bound inside the `if let` guard (e.g., `y` in the example above) are available within the body of the match arm where the guard evaluates to `true`, but are not accessible in other arms or outside the match expression. | ||
|
||
```rust,ignore |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
```rust,ignore | |
```rust |
src/expressions/match-expr.md
Outdated
2. Guard evaluation happens after that, and: | ||
* It runs using a shared borrow of the scrutinee | ||
* You cannot move from the scrutinee inside the guard. | ||
* New bindings created inside the guard (e.g., via `if let Some(y) = expr`) are local to the guard and do not persist into the match arm body. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does that mean?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've updated it and it now should make more sense
``` | ||
> [!NOTE] | ||
> Unlike regular if guards, `if let` guards execute only once per match arm, even if the pattern uses the `|` operator to match multiple patterns. This avoids repeated evaluation and potential side effects. | ||
> ```rust,ignore |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
> ```rust,ignore | |
> ```rust |
0f5f792
to
bf22e9c
Compare
@WaffleLapkin not sure if you got notifications when i update something, but i update almost all your reviews expect ones that asks to make code runnable, because im not sure if this is possible, we can remove |
It’s been a while since the original PR for
if let
guards was opened, so I decided to take the initiative and push it a bit closer to stabilizationThis PR adds some documentation — I did my best to keep it consistent with the existing docs on
if
guardsThere might still be some rough edges or small inaccuracies, so feel free to point them out
It’s also my first time contributing to the docs, so any feedback is appreciated!
Tracking issue rust-lang/rust#51114
rendered