类型和边界

单行格式

  • [T] 没有空格
  • [T; expr],例如,[u32; 42][Vec<Foo>; 10 * 2 + foo()] (冒号后有空格,方括号周围没有空格)
  • *const T*mut T* 之后没有空格,类型之前有空格)
  • &'a T&T&'a mut T&mut T& 之后没有空格,其他单词之间用单个空格分隔)
  • unsafe extern "C" fn<'a, 'b, 'c>(T, U, V) -> Wfn()(关键字和符号周围以及逗号后有单个空格,没有尾随逗号,括号周围没有空格)
  • ! 被视为任何其他类型名称,例如 Name
  • (A, B, C, D)(逗号后有空格,圆括号周围没有空格,除非是单元素元组,否则没有尾随逗号)
  • <Baz<T> as SomeTrait>::Foo::BarFoo::Bar::Foo::Bar:: 或尖括号周围没有空格,as 周围有单个空格)
  • Foo::Bar<T, U, V>(逗号后有空格,没有尾随逗号,尖括号周围没有空格)
  • T + T + T(类型和 + 之间有单个空格)。
  • impl T + T + T(关键字、类型和 + 之间有单个空格)。

不要在类型中使用的括号周围加空格,例如,(Foo)

换行

尽可能避免在类型中换行。优先在外层作用域换行,例如,优先

#![allow(unused)]
fn main() {
Foo<
    Bar,
    Baz<Type1, Type2>,
>
}

而不是

#![allow(unused)]
fn main() {
Foo<Bar, Baz<
    Type1,
    Type2,
>>
}

如果类型需要换行才能容纳,本节概述了必要时在何处换行此类类型。

如有必要,在 [T; expr] 中的 ; 之后换行。

函数类型遵循函数声明的规则换行。

泛型类型遵循泛型的规则换行。

使用 + 的类型在 + 之前换行,并对后续行进行块缩进。在换行此类类型时,在每个 + 之前换行

#![allow(unused)]
fn main() {
impl Clone
    + Copy
    + Debug

Box<
    Clone
    + Copy
    + Debug
>
}