语句

Let 语句

: 之后和 = 的两侧(如果存在)放置一个空格。不要在分号前放置空格。

#![allow(unused)]
fn main() {
// A comment.
let pattern: Type = expr;

let pattern;
let pattern: Type;
let pattern = expr;
}

如果可能,将声明格式化为单行。如果不可能,则尝试在 = 之后拆分,如果声明适合两行。块缩进表达式。

#![allow(unused)]
fn main() {
let pattern: Type =
    expr;
}

如果第一行仍然不适合单行,则在 : 之后拆分,并使用块缩进。如果类型需要多行,即使在 : 之后换行后,也应将第一行放在与 : 相同的行上,但要遵守组合规则

#![allow(unused)]
fn main() {
let pattern:
    Type =
    expr;
}

例如,

#![allow(unused)]
fn main() {
let Foo {
    f: abcd,
    g: qwer,
}: Foo<Bar> =
    Foo { f, g };

let (abcd,
    defg):
    Baz =
{ ... }
}

如果表达式跨越多行,则如果表达式的第一行适合剩余空间,则它会与 = 保持在同一行,并且表达式的其余部分不会进一步缩进。如果第一行不适合,则将表达式放在后续行上,并块缩进。如果表达式是一个块,并且类型或模式跨越多行,则将左大括号放在新行上并且不缩进(这为块的内部提供了与类型的分隔);否则,左大括号跟在 = 后面。

示例

#![allow(unused)]
fn main() {
let foo = Foo {
    f: abcd,
    g: qwer,
};

let foo =
    ALongName {
        f: abcd,
        g: qwer,
    };

let foo: Type = {
    an_expression();
    ...
};

let foo:
    ALongType =
{
    an_expression();
    ...
};

let Foo {
    f: abcd,
    g: qwer,
}: Foo<Bar> = Foo {
    f: blimblimblim,
    g: blamblamblam,
};

let Foo {
    f: abcd,
    g: qwer,
}: Foo<Bar> = foo(
    blimblimblim,
    blamblamblam,
);
}

else 块(let-else 语句)

let 语句可以包含一个 else 组件,使其成为 let-else 语句。在这种情况下,始终将相同的格式化规则应用于 else 块之前的组件(即 let pattern: Type = initializer_expr 部分),如 其他 let 语句中所述。

如果以下所有条件都为真,则将整个 let-else 语句格式化为单行

  • 整个语句是短的
  • else 块仅包含单行表达式且不包含语句
  • else 块不包含注释
  • else 块之前的 let 语句组件可以格式化为单行
#![allow(unused)]
fn main() {
let Some(1) = opt else { return };
}

否则,let-else 语句需要一些换行符。

如果在多行上分隔 let-else 语句,则永远不要在 else{ 之间分隔,并且始终在 } 之前分隔。

如果 else 之前的 let 语句组件可以格式化为单行,但 let-else 不符合完全放在单行上的条件,则将 else { 与初始化表达式放在同一行,它们之间有一个空格,然后在 { 之后换行。缩进关闭的 } 以匹配 let,并将包含的块进一步缩进一级。

#![allow(unused)]
fn main() {
let Some(1) = opt else {
    return;
};

let Some(1) = opt else {
    // nope
    return
};
}

如果 else 之前的 let 语句组件可以格式化为单行,但 else { 不适合放在同一行上,则在 else 之前换行。

#![allow(unused)]
fn main() {
    let Some(x) = some_really_really_really_really_really_really_really_really_really_long_name
    else {
        return;
    };
}

如果初始化表达式是多行的,则将 else 关键字和块的左大括号(即 else {)与初始化表达式的末尾放在同一行上,它们之间有一个空格,当且仅当以下所有条件都为真时

  • 初始化表达式以一个或多个右括号、方括号和/或大括号结尾
  • 该行上没有其他内容
  • 该行的缩进级别与初始 let 关键字相同。

例如

#![allow(unused)]
fn main() {
let Some(x) = y.foo(
    "abc",
    fairly_long_identifier,
    "def",
    "123456",
    "string",
    "cheese",
) else {
    bar()
}
}

否则,将 else 关键字和左大括号放在初始化表达式末尾之后的下一行,else 关键字的缩进级别与 let 关键字相同。

例如

fn main() {
    let Some(x) = abcdef()
        .foo(
            "abc",
            some_really_really_really_long_ident,
            "ident",
            "123456",
        )
        .bar()
        .baz()
        .qux("fffffffffffffffff")
    else {
        return
    };

    let Some(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) =
        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    else {
        return;
    };

    let LongStructName(AnotherStruct {
        multi,
        line,
        pattern,
    }) = slice.as_ref()
    else {
        return;
    };

    let LongStructName(AnotherStruct {
        multi,
        line,
        pattern,
    }) = multi_line_function_call(
        arg1,
        arg2,
        arg3,
        arg4,
    ) else {
        return;
    };
}

语句位置中的宏

对于语句位置中的宏使用,请使用圆括号或方括号作为分隔符,并以分号终止。不要在名称、!、分隔符或 ; 周围放置空格。

#![allow(unused)]
fn main() {
// A comment.
a_macro!(...);
}

语句位置中的表达式

不要在表达式和分号之间放置空格。

<expr>;

使用分号终止语句位置中的所有表达式,除非它们以块结尾或用作块的值。

例如,

#![allow(unused)]
fn main() {
{
    an_expression();
    expr_as_value()
}

return foo();

loop {
    break;
}
}

如果表达式具有 void 类型,即使可以传播它,也请使用分号。例如,

#![allow(unused)]
fn main() {
fn foo() { ... }

fn bar() {
    foo();
}
}