用Clippy来优化Rust的程序代码

作者:孙宇晨 来源:www.5idf.cn 2020-02-29   阅读:

lint最早用于C语言,是一种用来检查程序代码的工具,现在的主流程序语言几乎都有lint可以使用,尤其是JavaScript、Python等直译式程序语言,因为它们的程序代码不会经过编译,所以特别需要使用lint来检查原始码。藉由lint,我们可以写出疑虑较少、效能更好或是更容易阅读的程序代码。Rust程序语言虽然是静态型别的程序语言,而且拥有十分严谨的编译器,但官方还是提供了一个lint工具──Clippy。

使用clippy

clippy的使用方法很简单,建议透过以下指令来执行:

cargo clippy --tests -- -W clippy::cargo

cargo clippy指令加上--tests参数,可以让它去检查测试用的Rust程序代码,如果需要的话,也可以加上--features--all-features--no-default-features参数来启用特色。clippy工具本身的-W参数可以用来设定要将哪一个的lint分类或是规则改设为「警告」(warn)层级,就会输出不符合该规则的位置,但不影响行程执行结束后回传的Exit Status;-A参数可以用来设定要将哪一个的lint分类或是规则改设为「允许」(allow)层级,就不会输出不符合该规则的位置;-D参数可以用来设定要将哪一个的lint分类或是规则改设为「拒绝」(deny)层级,就会输出不符合该规则的位置,且影响行程执行结束后回传的Exit Status。

clippy的lint规则分类有以下几项:

  • clippy::correctness:错误或是无用的程序代码,预设为「拒绝」层级。
  • clippy::style:不合乎(官方)习惯的程序代码,预设为「警告」层级。
  • clippy::complexity:可以被简化的程序代码,预设为「警告」层级。
  • clippy::perf:可以被加速的程序代码,预设为「警告」层级。
  • clippy::all:即表示以上四个分类。方便整体控制层级用的,例如-D clippy::all就是-D clippy::correctness -D clippy::style -D clippy::complexity -D clippy::perf
  • clippy::restriction:程序代码语法结构与风格的规则,预设为「允许」层级。可能会与以上分类的规则有所冲突。
  • clippy::cargo:Cargo设定档(即Cargo.toml),预设为「允许」层级。Clippy可以检查Cargo设定档中缺失的设定项目,和相依crate的版本问题。
  • clippy::pedantic:其它比较严格的规则,预设为「允许」层级。
  • clippy::nursery:尚未稳定的规则,预设为「允许」层级。

所有的lint规则,以及规定原因都可以来这个网页查询。

利用巨集来设定lint规则

藉由#[allow(...)]#[warn(...)]#[deny(...)]属性,我们可以在Rust程序代码中临时设定lint规则。

例如:


 
fn main (){
 
let x: u64 = 61864918973511 ;
 
 
 
println! ( "{}" , x);
 
}

以上程序的第二行叙述会触犯clippy::unreadable_literal规则,如果要针对这个x变数避免Clippy出现警告,可以对其加上#[allow(clippy::unreadable_literal)]属性。如下:


 
fn main (){
 
#[allow(clippy::unreadable_literal)]
 
let x: u64 = 61864918973511 ;
 
 
 
println! ( "{}" , x);
 
}

可配置的lint规则

有些lint规则可以透过Clippy的设定档来指定参数。cargo cargo指令在执行的时候,首先会寻找工作目录中是否有.clippy.toml档案,如果有的话就会将其作为clippy的设定档,如果没有的话就会再寻找工作目录中是否有clippy.toml档案,如果还是没有的话,就会去寻找上层目录是否有.clippy.tomlclippy.toml档案,依此类推。

可以被配置的lint规则如下:


 
blacklisted-names = [ "foo" , "bar" , "baz" , "quux" ] # clippy::blacklisted_name
 
cognitive-complexity-threshold = 25 # clippy::cognitive_complexity
 
doc-valid-idents = [ "KiB" , "MiB" , "GiB" , "TiB" , "PiB" , "EiB" , "DirectX" , "ECMAScript" , "GPLv2" , "GPLv3" , "GitHub" , "GitLab" , "IPv4" , "IPv6" , "JavaScript" , "NaN" , "NaNs" , "OAuth" , "OpenGL" ,"OpenSSH" , "OpenSSL" , "OpenStreetMap" , "TrueType", "iOS" , "macOS" , "TeX" , "LaTeX" , "BibTeX" , "BibLaTeX" , "MinGW" , "CamelCase" ] # clippy::doc_markdown
 
enum-variant-name-threshold = 3 # clippy::enum_variant_names
 
enum-variant-size-threshold = 200 # clippy::large_enum_variant
 
single-char-binding-names-threshold = 5 # clippy::many_single_char_names
 
too-large-for-stack = 200 # clippy::boxed_local
 
too-many-arguments-threshold = 7 # clippy::too_many_arguments
 
trivial-copy-size-limit = 1 # clippy::trivially_copy_pass_by_ref
 
type-complexity-threshold = 250 # clippy::type_complexity
 
verbose-bit-mask-threshold = 1 # clippy::verbose_bit_mask
 
 
 
# too_many_lines = 100 # clippy::too_many_lines (pedantic)

分享给小伙伴们:
如果本文侵犯了您的权利, 请联系本网立即做出处理,谢谢。
当前位置:孙宇晨博客 > 技术 > 《用Clippy来优化Rust的程序代码转载请注明出处。
相关文章
  • 用rustfmt让Rust的程序代码能自动排版

    用rustfmt让Rust的程序代码能自动排版