P.FMT.04 语言项(Item) 定义时左花括号(brace)位置应该与语言项保持同一行

【描述】

为了保持代码结构的良好可读性,Rust 中定义各种语言项,包括控制结构(if / match 等)、函数、结构体、枚举等,要求左花括号与其定义保持同一行。

但是如果携带 where语句,则要求换行,并且where 子句和 where 关键字不在同一行。

rustfmt 提供三个配置项对不同的语言项进行格式化:

  • brace_style 配置项对应于大部分语言项,包括函数、结构体等,但是控制结构(if / match等)除外,默认值为SameLineWhere,代表左花括号与语言项定义保持同一行。
  • where_single_line 配置项对应于 where 语句,默认值是 false,表示 where语句的花括号是换行。
  • control_brace_style 配置项对应于控制结构(if / match等),默认值为AlwaysSameLine,表示左花括号与语言项定义保持同一行。

所以,只需要使用 rustfmt 默认配置即可。

【反例】

如果设置 brace_style = "AlwaysNextLine",则不符合。


#![allow(unused)]
fn main() {
// 不符合: 左花括号与函数语言项定义未保持同一行
fn lorem()
{
    // body
}
}

如果设置 brace_style = "PreferSameLine",则符合:


#![allow(unused)]
fn main() {
// 不符合: 左花括号与 where 语句 应该换行
fn lorem<T>(ipsum: T)
where
    T: Add + Sub + Mul + Div, { // 注意这里和 `SameLineWhere`的区别
    // body
}
}

结构体与枚举:

如果设置 brace_style = "AlwaysNextLine",则不符合:


#![allow(unused)]
fn main() {
// 不符合: 左花括号与结构体语言项定义未保持同一行
struct Lorem
{
    ipsum: bool,
}
}

如果设置 brace_style = "PreferSameLine",则符合:


#![allow(unused)]
fn main() {
// 不符合: 左花括号与 where 语句应该换行
struct Dolor<T>
where
    T: Eq, {
    sit: T,
}
}

流程控制倾向于默认使用 AlwaysSameLine,即,总在同一行。因为流程控制没有where子句。

如果设置 brace_style = "AlwaysNextLine",则不符合:

fn main() {
    // 不符合: 左花括号与控制结构未保持同一行
    if lorem
    {
        println!("ipsum!");
    }
    else
    {
        println!("dolor!");
    }
}

【正例】

函数:


#![allow(unused)]
fn main() {
// 符合: 左花括号和 函数语言项定义在同一行
fn lorem() { 
    // body
}

fn lorem<T>(ipsum: T)
where // 符合:`where` 子句和 `where` 关键字不在同一行
    T: Add + Sub + Mul + Div,
{ // 符合:当有 `where` 子句的时候,花括号换行
    // body
}
}

结构体与枚举


#![allow(unused)]
fn main() {
// 符合
struct Lorem {
    ipsum: bool,
}

// 符合
struct Dolor<T>
where 
    T: Eq,
{
    sit: T,
}
}

流程控制倾向于默认使用 AlwaysSameLine,即,总在同一行。因为流程控制没有where子句。

// 符合
// "AlwaysSameLine" (default)
fn main() {
    if lorem {
        println!("ipsum!");
    } else {
        println!("dolor!");
    }
}

【rustfmt 配置】

对应选项可选值是否 stable说明
brace_styleSameLineWhere (默认)No应该与语言项保持同一行,但是 where 语句例外
brace_styleAlwaysNextLineNo应该在语言项的下一行
brace_stylePreferSameLineNo总是优先与语言项保持同一行,where 语句也不例外
where_single_linefalse(默认)No强制将 where 子句放在同一行上
control_brace_style in control-flowAlwaysSameLine (默认)No总在同一行上,用于控制流程中默认值
control_brace_style in control-flowClosingNextLineNo用于控制流程中 else 分支在 if 分支结尾处换行