🦀
Rust 1.67.0 must_use on `async fn`を触ってみた
はじめに
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