🦀

Rust 1.67.0 must_use on `async fn`を触ってみた

2023/01/29に公開

はじめに

2023 1/26 に Rust v1.67.0がリリースされました。
その中の #[must_use]async fnで使用できるようになったとあったので、実際に触ってみました。

リリースノート: https://blog.rust-lang.org/2023/01/26/Rust-1.67.0.html

#[must_use]とは

#[must_use] attribution は関数に使うと関数の返り値を使用しないと warning を返してくれるようになります。

例えば value a, bの合計値を返す sum 関数を作成してみましょう。

fn sum(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    sum(1, 2);
}
$ cargo run
   Compiling app v0.1.0 (/Users/s14960/ghq/github.com/yuki0418/rust-practice/app)
    Finished dev [unoptimized + debuginfo] target(s) in 0.41s
     Running `target/debug/app`

sum は返り値を定義しなくても実行できます。
次は #[must_use] をつけてみます。

#[must_use]
fn sum(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    sum(1, 2);
}
$ cargo run
   Compiling app v0.1.0 (/Users/s14960/ghq/github.com/yuki0418/rust-practice/app)
warning: unused return value of `sum` that must be used
 --> src/main.rs:7:5
  |
7 |     sum(1, 2);
  |     ^^^^^^^^^
  |
  = note: `#[warn(unused_must_use)]` on by default

warning: `app` (bin "app") generated 1 warning
    Finished dev [unoptimized + d

今度は warning: unused return value of 'sum' that must be used というメッセージが表示されるようになりました。

async fn で使えるようになった

上記は以前は async fn では使えなかったのですが、今回のリリースで使用できるようになりました。

#[must_use]
async fn sum(a: i32, b: i32) -> i32 {
    a + b
}

#[tokio::main]
async fn main() {
    sum(1, 2).await;
}
$ cargo run
warning: unused output of future returned by `sum` that must be used
 --> src/main.rs:8:5
  |
8 |     sum(1, 2).await;
  |     ^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_must_use)]` on by default

warning: `app` (bin "app") generated 1 warning
    Finished dev [unoptimized + debuginfo] target(s) in 0.44s
     Running `target/debug/app`

同じように warning が出ますね!

まとめ

返り値を使うのを忘れるのを防ぐ時に使うみたいですが、あまりユーズケースが思いつきませんでした。調べてみたところ Standard library developers Guide に例が載ってました。
Standard library developers Guide: https://std-dev-guide.rust-lang.org/code-considerations/design/must-use.html

他にアイデアあったら共有してほしいです。

Discussion