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

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

为了解决不同开发者有各自不同的程序代码风格的问题。像是有些人习惯用一个tab字元进行缩排;有些人则习惯用两个或四个空格字元来进行缩排。有些人习惯if或for回圈的大括号要先换行;有些人则习惯和关键字写在同一行。Rust官方提供了rustfmt这个工具来进行官方建议的程序排版方式。

使用rustfmt

rustfmt指令可以针对特定几个Rust档案( .rs)进行排版。例如:

rustfmt src/lib.rs src/main.rs

如果是要排版整个Cargo专案下的Rust档案,指令如下:

cargo fmt

排版风格

rustfmt的排版风格是可以自订的。rustfmt或是cargo fmt指令在执行的时候,首先会寻找工作目录中是否有.rustfmt.toml档案,如果有的话就会将其作为rustfmt的设定档,如果没有的话就会再寻找工作目录中是否有rustfmt.toml档案,如果还是没有的话,就会去寻找上层目录是否有.rustfmt.tomlrustfmt.toml档案,依此类推。至于rustfmt设定档的撰写方式,可以参考这个文件

以下是一个rustfmt设定档的撰写范例:

 
brace_style = "PreferSameLine"
 
enum_discrim_align_threshold = 100
 
force_explicit_abi = false
 
force_multiline_blocks = true
 
format_code_in_doc_comments = true
 
format_macro_matchers = true
 
max_width = 100
 
newline_style = "Unix"
 
normalize_doc_attributes = true
 
overflow_delimited_expr = true
 
reorder_impl_items = true
 
struct_lit_single_line = false
 
use_field_init_shorthand = true
 
use_small_heuristics = "Off"
 
use_try_shorthand = true

rustfmt的设定档有些设定项目是不稳定的(unstable),如果要将其加进rustfmt设定档中并成功套用的话,要透过Rust Nightly工具链来安装rustfmt若预设的工具链不是Rust Nightly,可以用以下指令来安装rustfmt

rustup toolchain add nightly && rustup component add rustfmt --toolchain nightly

并用以下指令来排版整个Cargo专案:

cargo +nightly fmt

利用巨集来略过排版

如果我们某部份的程序代码想要保留输入时的排版方式,可以对其添加#[rustfmt::skip]属性。

例如:

#[rustfmt::skip] 
const NO_REF_8_07: [ u8 ; 256 ] = [ 0u8 , 7u8 , 14u8 , 9u8 , 28u8 , 27u8 , 18u8 , 21u8 , 56u8 , 63u8 , 54u8 , 49u8 , 36u8 , 35u8 , 42u8 , 45u8 , 112u8 , 119u8 , 126u8 , 121u8 , 108u8 , 107u8 ,98u8 , 101u8 , 72u8 , 79u8 , 70u8 , 65u8 , 84u8 , 83u8 , 90u8 , 93u8 , 224u8 , 231u8 , 238u8 , 233u8 , 252u8 , 251u8 , 242u8 , 245u8 , 216u8 , 223u8 , 214u8 , 209u8 , 196u8 , 195u8 , 202u8 , 205u8 ,144u8 , 151u8 , 158u8 , 153u8 , 140u8 , 139u8 , 130u8 , 133u8 , 168u8 , 175u8 , 166u8 , 161u8 , 180u8 , 179u8 , 186u8 , 189u8 , 199u8 , 192u8 , 201u8 , 206u8 , 219u8 , 220u8 , 213u8 , 210u8 , 255u8 , 248u8 ,241u8 , 246u8 , 227u8 , 228u8 , 237u8 , 234u8 , 183u8 , 176u8 , 185u8 , 190u8 , 171u8 , 172u8 , 165u8 , 162u8 , 143u8 , 136u8 , 129u8 , 134u8 , 147u8 , 148u8 , 157u8 , 154u8 , 39u8 , 32u8 , 41u8 , 46u8 ,59u8 , 60u8 , 53u8 , 50u8 , 31u8 , 24u8 , 17u8 , 22u8 , 3u8 , 4u8 , 13u8 , 10u8 , 87u8 , 80u8 , 89u8 , 94u8 , 75u8 , 76u8 , 69u8 , 66u8 , 111u8 , 104u8 , 97u8 , 102u8 , 115u8 , 116u8 , 125u8, 122u8 , 137u8 , 142u8 , 135u8 , 128u8 , 149u8 , 146u8 , 155u8 , 156u8 , 177u8 , 182u8 , 191u8 , 184u8 , 173u8 , 170u8 , 163u8 , 164u8 , 249u8 , 254u8 , 247u8 , 240u8 , 229u8 , 226u8 , 235u8 , 236u8 , 193u8, 198u8 , 207u8 , 200u8 , 221u8 , 218u8 , 211u8 , 212u8 , 105u8 , 110u8 , 103u8 , 96u8 , 117u8 , 114u8 , 123u8 , 124u8 , 81u8 , 86u8 , 95u8 , 88u8 , 77u8 , 74u8 , 67u8 , 68u8 , 25u8 , 30u8 , 23u8, 16u8 , 5u8 , 2u8 , 11u8 , 12u8 , 33u8 , 38u8 , 47u8 , 40u8 , 61u8 , 58u8 , 51u8 , 52u8 , 78u8 , 73u8 , 64u8 , 71u8 , 82u8 , 85u8 , 92u8 , 91u8 , 118u8 , 113u8 , 120u8 , 127u8 , 106u8 ,109u8 , 100u8 , 99u8 , 62u8 , 57u8 , 48u8 , 55u8 , 34u8 , 37u8 , 44u8 , 43u8 , 6u8 , 1u8 , 8u8 , 15u8 , 26u8 , 29u8 , 20u8 , 19u8 , 174u8 , 169u8 , 160u8 , 167u8 , 178u8 , 181u8 , 188u8 , 187u8, 150u8 , 145u8 , 152u8 , 159u8 , 138u8 , 141u8 , 132u8 , 131u8 , 222u8 , 217u8 , 208u8 , 215u8 , 194u8 , 197u8 , 204u8 , 203u8 , 230u8 , 225u8 , 232u8 , 239u8 , 250u8 , 253u8 , 244u8 , 243u8 ];

#[rustfmt::skip] 
const NO_REF_8_1D: [ u8 ; 256 ] = [ 0u8 , 29u8 , 58u8 , 39u8 , 116u8 , 105u8 , 78u8 , 83u8 , 232u8 , 245u8 , 210u8 , 207u8 , 156u8 , 129u8 , 166u8 , 187u8 , 205u8 , 208u8 , 247u8 , 234u8 , 185u8 , 164u8 ,131u8 , 158u8 , 37u8 , 56u8 , 31u8 , 2u8 , 81u8 , 76u8 , 107u8 , 118u8 , 135u8 , 154u8 , 189u8 , 160u8 , 243u8 , 238u8 , 201u8 , 212u8 , 111u8 , 114u8 , 85u8 , 72u8 , 27u8 , 6u8 , 33u8 , 60u8 ,74u8 , 87u8 , 112u8 , 109u8 , 62u8 , 35u8 , 4u8 , 25u8 , 162u8 , 191u8 , 152u8 , 133u8 , 214u8 , 203u8 , 236u8 , 241u8 , 19u8 , 14u8 , 41u8 , 52u8 , 103u8 , 122u8 , 93u8 , 64u8 , 251u8 , 230u8 ,193u8 , 220u8 , 143u8 , 146u8 , 181u8 , 168u8 , 222u8 , 195u8 , 228u8 , 249u8 , 170u8 , 183u8 , 144u8 , 141u8 , 54u8 , 43u8 , 12u8 , 17u8 , 66u8 , 95u8 , 120u8 , 101u8 , 148u8 , 137u8 , 174u8 , 179u8 ,224u8 , 253u8 , 218u8 , 199u8 , 124u8 , 97u8 , 70u8 , 91u8 , 8u8 , 21u8 , 50u8 , 47u8 , 89u8 , 68u8 , 99u8 , 126u8 , 45u8 , 48u8 , 23u8 , 10u8 , 177u8 , 172u8 , 139u8 , 150u8 , 197u8 , 216u8 ,255u8 , 226u8 , 38u8 , 59u8 , 28u8 , 1u8 , 82u8 , 79u8 , 104u8 , 117u8 , 206u8 , 211u8 , 244u8 , 233u8 , 186u8 , 167u8 , 128u8 , 157u8 , 235u8 , 246u8 , 209u8 , 204u8 , 159u8 , 130u8 , 165u8 , 184u8 ,3u8 , 30u8 , 57u8 , 36u8 , 119u8 , 106u8 , 77u8 , 80u8 , 161u8 , 188u8 , 155u8 , 134u8 , 213u8 , 200u8 , 239u8 , 242u8 , 73u8 , 84u8 , 115u8 , 110u8 , 61u8 , 32u8 , 7u8 , 26u8 , 108u8 , 113u8 ,86u8 , 75u8 , 24u8 , 5u8 , 34u8 , 63u8 , 132u8 , 153u8 , 190u8 , 163u8 , 240u8 , 237u8 , 202u8 , 215u8 , 53u8 , 40u8 , 15u8 , 18u8 , 65u8 , 92u8 , 123u8 , 102u8 , 221u8 , 192u8 , 231u8 , 250u8 ,169u8 , 180u8 , 147u8 , 142u8 , 248u8 , 229u8 , 194u8 , 223u8 , 140u8 , 145u8 , 182u8 , 171u8 , 16u8 , 13u8 , 42u8 , 55u8 , 100u8 , 121u8 , 94u8 , 67u8 , 178u8 , 175u8 , 136u8 , 149u8 , 198u8 , 219u8 ,252u8 , 225u8 , 90u8 , 71u8 , 96u8 , 125u8 , 46u8 , 51u8 , 20u8 , 9u8 , 127u8 , 98u8 , 69u8 , 88u8 , 11u8 , 22u8 , 49u8 , 44u8 , 151u8 , 138u8 , 173u8 , 176u8 , 227u8 , 254u8 , 217u8 , 196u8 ];

以上两个阵列因为很长,而且也没有排版的意义,所以就直接让它从头到尾一行写完,并且加上#[rustfmt::skip]属性,使它们不会被rustfmt排版。

单纯检查没有排好的地方

rustfmtcargo fmt指令预设会直接对原档案进行排版更动,如果我们只是想要检查Rust档案中有哪些地方没有按照rustfmt设定档的规则来排版的话,可以加上--check参数。

如下:

rustfmt --check src/main.rs

cargo fmt -- --check

分享给小伙伴们:
如果本文侵犯了您的权利, 请联系本网立即做出处理,谢谢。
当前位置:孙宇晨博客 > 技术 > 《用rustfmt让Rust的程序代码能自动排版转载请注明出处。
相关文章
  • 初学者学算法|谈什么是算法和时间复杂度

    初学者学算法|谈什么是算法和时间复杂度

  • 我想学程序,但到底该从哪个语言入门?

    我想学程序,但到底该从哪个语言入门?

  • 如何给液晶电视刷程序

    如何给液晶电视刷程序

  • ePSA诊断程序介绍

    ePSA诊断程序介绍