当前位置: 首页 > news >正文

【译文/effective-rust】第 29 条:遵循 Clippy 的建议 - liyan

“看起来你在写信。需要什么帮助么?” —— Microsoft Clippit

第 31 条会描述了 Rust 工具箱中一些很有用的工具。但是其中一个特别有用且重要的工具值的在这里进行进行单独的介绍:Clippy。

Clippy 是 Cargo 的一个附加模块(通过cargo clippy的方式调用)。它可以生成涵盖多种类别的warining信息:

  • 正确性:提示常见的编程错误。
  • 风格:提示不完全符合 Rust 标准风格的代码结构。
  • 简洁性:指出能让代码更加简洁的可行变更。
  • 性能:提示能避免无效处理或者内存分配的可选项。
  • 可读性:给出能让代码更易读或者更易懂的建议。

比如,如下这段代码编译是正常的:

pub fn circle_area(radius: f64) -> f64 {let pi = 3.14;pi * radius * radius
}

但是 Clippy 会指出这里对 π 的近似赋值是没必要且不准确的:

error: approximate value of `f{32, 64}::consts::PI` found--> src/main.rs:5:18|
5 |         let pi = 3.14;|                  ^^^^|= help: consider using the constant directly= help: for further information visithttps://rust-lang.github.io/rust-clippy/master/index.html#approx_constant= note: `#[deny(clippy::approx_constant)]` on by default

链接中的文档解释了问题并且给出了优化代码的方式。上述示例可调整为:

pub fn circle_area(radius: f64) -> f64 {std::f64::consts::PI * radius * radius
}

正如示例中所展示的,每个 Clippy 警告都会伴随着一个网页的链接来描述问题。链接的网页中会说明为什么目标代码会被认为是不恰当的。这些说明很重要:它们的存在使得你可以自行判断采纳这些建议或者由于特殊的原因而忽略它们。有的时候,说明文本中还会描述一些校验器的已知问题,这些描述会解释一些令人困惑的误报。

如果你认定一些警告信息和自己的代码没有关系,你可以通过添加(#[allow(clippy::some_line)])来忽略关联代码的报错,或者在包的顶层(top level)添加(#![allow(clipy::some_lint)])来忽略整个包中的警告信息。通常情况下,建议调整目标代码而非花费很多时间来确认警告关联的代码是否是一个罕见的误报。

无论你选择了修复或者忽略掉这些警告信息,请确保你的代码中没有 Clippy-warning 的信息

这样,当新的警告信息出现时 —— 无论是由于代码发生了调整还是 Clippy 升级后包含了新的校验信息 —— 我们就能够及时的关注到。Clippy 也应当被纳入你的持续集成系统中(第 32 条)。

Clippy 的警告信息在你学习 Rust 时特别重要,因为它们可以揭示那些被你忽略的细节,并帮助你熟悉 Rust 的风格。

本书中提到的很多建议,在 Clippy 中均存在相关的警告信息:

  • 第 1 条建议使用更具表现力的类型,而非一般的bool类型。Clippy 也指出了在函数参数以及结构体中使用多个bool类型的问题。
  • 第 3 条包括了一些OptionResult类型的操作。Clippy 指出了一些可行的精简行为,比如:
    • Unnecessarily converting Result to Option
    • Opportunities to use unwrap_or_default
  • 第 3 条同样建议了应当将错误返回给调用方。Clippy [指出了应当返回的地方]。
  • 第 5 条应当实现From特征而非Into
  • 第 5 条还描述了一些强制转换,而 Clippy 给出了如下的警告(对应的检查项默认是关掉的):
    • as casts that could be from instead。
    • as casts that might truncate。
    • as casts that might wrap。
    • as casts that lose precision。
    • as casts that might convert signed negative numbers to large positive numbers。
    • any use of as
  • 第 8 条描述了胖指针类型,并且很多 Clippy 的校验器指出了一些非必要的额外的指针间接访问:
    • Holding a heap-allocated collection in a Box
    • Holding a heap-allocated collection of Box items。
    • Taking a reference to a Box
  • 第 9 条描述了操作Iterator实例的诸多方法。Clippy 包含了诸多的可以简化迭代器方法使用的校验器[1]
  • 第 10 条描述了 Rust 的标准特性,并且包含了很多 Clippy 会校验到的实现时的要求:
    • Ord must agree with PartialOrd
    • PartialEq::ne should not need a nondefault implementation(参照 第 13 条)。
    • Hash and Eq must be consistent。
    • Clone for Copy types should match。
  • 第 18 条提供了一些关于减少panic!或类似expect的方法,这些建议也会在 Clippy 的校验器中检查到。
  • 第 21 条表述了引入通过通配符限定的包是不明智的。Clippy 同样对此进行了校验。
  • 第 23 条及第 25 条涉及到一种不同版本的包出现在同一个项目的依赖中。Clippy 可以通过配置,在问题出现时给出警告信息。
  • 第 26 条叙述了 Cargo 特性的一些相加性,而 Clippy 会将与此原则相违背特性提示为“否定”的特性。
  • 第 26 条同样表述了一个包的可选依赖项同样是其特征集的一部分。如果存在需要明确的特性名(如:"use-crate-x"形式的命名)时,Clippy 将会提示直接应当使用明确的特性名,而非模糊的。
  • 第 27 条描述了文档注释的约束,Clippy 同时有如下的提示:
    • Missing descriptions of panic!s。
    • Missing descriptions of unsafe concerns。

上述的信息无疑说明了阅读 Clippy 的警告信息列表同样是一种有意义的学习方式 —— 包括那些默认被关掉校验的原因,是由于它们太严苛了还是由于它们会产生虚警?尽管你可能并不希望代码中出现这么多的警告信息,领悟这些校验规则出现的原因将会提升你对 Rust 及其风格的理解。

注释

原文点这里查看


  1. 部分校验器列举如下。explicit_counter_loop,explicit_iter_loop,explicit_into_iter_loop,filter_map_identity,from_iter_instead_of_collect,into_iter_on_ref,iter_count,iter_next_loop,iter_not_returning_iterator,manual_filter_map,manual_find_map,map_clone,needless_range_loop,search_is_some,skip_while_next,suspicious_map,unnecessary_filter_map,unnecessary_fold。 ↩︎

http://www.jsqmd.com/news/481963/

相关文章:

  • 2026年上海公司注册代办TOP5:上海众轩实业有限公司的联系方式? - 企业推荐官【官方】
  • org-mode使用备注 - liyan
  • 三菱 FX2N PLC 控制步进电机:探索自动化控制之路
  • 2026年贵州营业性演出许可证办理指南:这5大关键步骤,你准备好了吗? - 企业推荐官【官方】
  • 从Hugo到Zola——又一次博客迁移 - liyan
  • C盘清理,C盘变红解决方法最全指南(2026最新版),轻松解决C盘爆满问题,c盘怎么清理垃圾而不误删文件
  • 2026年电商直播带货主播财税合规指南:如何一站式解决主播与店铺的三大财税难题? - 企业推荐官【官方】
  • 2026年主播带货电商财税合规避坑指南:这5大代理记账公司为何口碑领先行业? - 企业推荐官【官方】
  • 实用C盘清理图文教程(2026最新版):安全有效C盘清理清理方法,远离C盘爆红,清理C盘不误删文件
  • 2026年带货直播电商主播财税合规指南:TOP 10一站式服务商如何帮你省心省力? - 企业推荐官【官方】
  • Kairoa 开发者工具箱 v1.1.16 版本:AI 聊天体验全面升级
  • 使用opensandbox结合ADK创建agent并测试沙盒环境
  • 打造 Spring Boot + Vue 的库存管理系统:技术融合与实践
  • 计算机毕业设计 | SpringBoot小米商城 购物管理系统(附源码)
  • 生成式深度学习(四)
  • 全屋定制行业格局解析:2026年大连主流品牌核心竞争力全景对比 - 品牌推荐
  • 计算机毕业设计 | node.js(Express)+vue影院售票商城 电影放映购物系统(附源码+论文)
  • PyTorch DDP分布式训练超快
  • PAT 乙级 1093
  • JAVA-Web端学习1 HTML和CSS格式
  • 2026年高端家装必看:大连全屋定制品牌选型指南与四大核心价值实测 - 品牌推荐
  • 工厂的历史演进:从工业革命到智能时代
  • 2026年用户口碑最佳的贵阳全屋定制推荐:五大品牌真实案例与长期服务对比 - 品牌推荐
  • AI元人文:习性或直觉——在算法时代人类自我修炼的方法论与情境智慧
  • OpenClawd的一个神器技能Skill Creator
  • 动态残差组改进YOLOv26双重注意力机制与残差学习深度融合
  • Trae AI编程工具关闭自动更新图文教程(建议收藏!!!)
  • go排序查找、二维数组
  • LeetCode 379 | 有序矩阵中第K小的元素
  • 全球医疗器械展会代理地域适配指南:各区域优质服务商精准推荐