Published on

must_use

基本作用

#[must_use]属性用于在值未被"使用"时发出诊断警告。

适用位置

可应用于以下三种场景:

1. 自定义复合类型

#[must_use]
struct MustUse {
    // 字段定义
}

// 触发警告
MustUse::new();

2. 函数

#[must_use]
fn five() -> i32 { 5i32 }

// 触发警告
five();

3. Trait

#[must_use]
trait Critical {}
impl Critical for i32 {}

fn get_critical() -> impl Critical {
    4i32
}

// 触发警告
get_critical();

自定义警告消息

可通过MetaNameValueStr语法添加说明:

#[must_use = "请检查返回值"]
fn important() -> bool { true }

Trait中的特殊用法

Trait函数标记

trait Trait {
    #[must_use]
    fn use_me(&self) -> i32;
}

impl Trait for i32 {
    fn use_me(&self) -> i32 { 0i32 }
}

// 触发警告
5i32.use_me();

实现中的注意点

在trait实现中标注无效:

impl Trait for i32 {
    #[must_use] // 无效果
    fn use_me(&self) -> i32 { 0i32 }
}

例外情况

以下表达式不会触发警告:

#[must_use]
fn five() -> i32 { 5i32 }

// 不会触发警告的情况
(five(),);          // 元组包装
Some(five());       // Option包装
{ five() };         // 块表达式最后一行
if true { five() } else { 0i32 };  // 分支表达式
match true { _ => five() }; // match表达式

推荐做法

有意忽略返回值时,使用let _模式:

let _ = five();  // 不会触发警告

THE END