- 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