You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The `#[must_use]` attribute can be applied to types or functions when failing to explicitly consider them or their output is almost certainly a bug.
4
+
5
+
As an example, `Result` is `#[must_use]` because failing to consider it may indicate a caller didn't realise a method was fallible:
6
+
7
+
```rust
8
+
// Is `check_status` infallible? Or did we forget to look at its `Result`?
9
+
check_status();
10
+
```
11
+
12
+
Operators like `saturating_add` are also `#[must_use]` because failing to consider their output might indicate a caller didn't realise they don't mutate the left-hand-side:
13
+
14
+
```rust
15
+
// A caller might assume this method mutates `a`
16
+
a.saturating_add(b);
17
+
```
18
+
19
+
Combinators produced by the `Iterator` trait are `#[must_use]` because failing to use them might indicate a caller didn't realize `Iterator`s are lazy and won't actually do anything unless you drive them:
20
+
21
+
```rust
22
+
// A caller might not realise this code won't do anything
23
+
// unless they call `collect`, `count`, etc.
24
+
v.iter().map(|x|println!("{}", x));
25
+
```
26
+
27
+
On the other hand, `thread::JoinHandle` isn't `#[must_use]` because spawning fire-and-forget work is a legitimate pattern and forcing callers to explicitly ignore handles could be a nuisance rather than an indication of a bug:
28
+
29
+
```rust
30
+
thread::spawn(|| {
31
+
// this background work isn't waited on
32
+
});
33
+
```
34
+
35
+
## For reviewers
36
+
37
+
Look for any legitimate use-cases where `#[must_use]` will cause callers to explicitly ignore values. If these are common then `#[must_use]` probably isn't appropriate.
38
+
39
+
The `#[must_use]` attribute only produces warnings, so it can technically be introduced at any time. To avoid accumulating nuisance warnings though ping `@rust-lang/libs` for input before adding new `#[must_use]` attributes to existing types and functions.
0 commit comments