このエラーと戦う:
warning: unused result which must be used, #[warn(unused_must_use)] on by default
例えば
こんなコード書くと出てくる:
print_foo.rs
use std::io::stdio::stdout;
fn main() {
stdout().write_line("foo");
}
$ rustc print_foo.rs
print_foo.rs:4:5: 4:31 warning: unused result which must be used, #[warn(unused_must_use)] on by default
print_foo.rs:4 stdout().write_str("foo");
^~~~~~~~~~~~~~~~~~~~~~~~~~
このコード含めて大体のケースにおいては返り値を使ってきちんとエラー処理したほうが良いと思うんですが、今回は簡単のためこれを例にします。
- 私が結果を無視したいと感じたケース: https://gist.github.com/kui/64d9357e9b91f8f149e4#file-invoke_external_process-rs-L35
- kill の成否はあまり関係ない
- 元の timeout による Error のほうを返したい
このエラーは must_use
がついた構造体が返り値を let x
でバインドするわけでもなく、メソッドチェーンするわけでもない時に出ます。今回のケースだと返り値は Result なのでソースコードを見るとそう書いてあるのがわかります。
書き方 1. _
にしまう
他のいくつかの言語同様に Rust でも _
にしまうような記述をすると「その値は使わないよ」という意図になります。具体的にはこう書く:
print_foo.rs
use std::io::stdio::stdout;
fn main() {
let _ = stdout().write_line("foo");
}
この書き方の起源って誰なんだろう。
書き方 2. attribute を指定する
結果を無視する記述をがある関数の attribute として allow(unused_must_use)
を指定する。具体的にはこう書く:
print_foo.rs
use std::io::stdio::stdout;
#[allow(unused_must_use)]
fn main() {
stdout().write_line("foo");
}
ただ、これだと、この関数(この例だと main
)内すべてが無視されてしまい勿体無いので、_
にしまうのを推奨します。
ソースがドキュメント的なきちんとまとまったところのものを知ってる人は教えて下さい。