G.GEN.02 使用 Rust 标准库中某些方法,要注意避免使用其泛型默认实现,而应该使用具体类型的实现

【级别】 建议

【描述】

Rust 标准库内部某些类型使用了 泛型特化(未稳定特性),比如 ToString trait。

该 trait 有一个泛型默认实现, 并且一些具体类型也实现了它,比如 char/ str / u8/ i8 等。

在实际代码中,应该选择去调用具体类型实现的 to_string() 方法,而非调用泛型的默认实现。

这一规则要求开发者对 Rust 标准库的一些方法实现有一定了解。

【反例】


#![allow(unused)]
#![warn(clippy::inefficient_to_string)]

fn main() {
// 不符合
// 闭包参数中, s 为 `&&str` 类型
//  `&&str` 就会去调用泛型的默认实现
["foo", "bar"].iter().map(|s| s.to_string() );
}

【正例】


#![allow(unused)]
#![warn(clippy::inefficient_to_string)]

fn main() {
// 符合
// 闭包参数中, s 为 `&&str` 类型,使用 `|&s|` 对参数模式匹配后,闭包体内 `s` 就变成了 `&str` 类型
// 经过这样的转换,直接调用 `&str`的 `to_string()` 方法,而如果是 `&&str` 就会去调用泛型的默认实现。 
["foo", "bar"].iter().map(|&s| s.to_string() );
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
inefficient_to_stringyesnopedanticallow