Skip to content

Commit 75ae109

Browse files
authored
3.30 review (#103)
* V 0.3 * V0.3: modify README * update Version to 0.3 * add code example for P.SEC.01 * modify P.SEC.01 * 3.30 review
1 parent 8b60526 commit 75ae109

26 files changed

+238
-348
lines changed

src/safe-guides/code_style/fmt.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,30 @@
22

33
制定统一的编码风格,是为了提升代码的可读性,让日常代码维护和团队之间审查代码更加方便。
44

5-
Rust 有自动化格式化工具 rustfmt ,可以帮助开发者摆脱手工调整代码格式的工作,提升生产力。但是,rustfmt 遵循什么样的风格规范,作为开发者应该需要了解,在编写代码的时候可以主动按这样的风格编写。
5+
Rust 有自动化格式化工具 rustfmt ,可以帮助开发者摆脱手工调整代码格式的工作,提升生产力。但是,rustfmt 遵循什么样的风格规范,作为开发者需要了解,在编写代码的时候可以主动按这样的风格编写。
66

7-
说明:以下 `rustfmt` 配置中对应配置项如果 `Stable``No`,则表示该配置项不能用于 Stable Rust 下在 `rustfmt.toml` 中自定义,但其默认值会在`cargo fmt`时生效。在 Nightly Rust 下则都可以自定义。
7+
说明:
88

9-
在 Stable Rust 下使用未稳定配置项的方法、了解配置示例及其他全局配置项说明请参阅:[Rustfmt 配置相关说明](./../Appendix/tools/rustfmt.md)
9+
对于 `rustfmt` 中未稳定的配置项(`Stable``No`),则表示该配置项不能在稳定版(Stable)Rust 中更改配置,但其默认值会在`cargo fmt`时生效。在 Nightly Rust 下则都可以自定义配置
1010

11-
注意: 以下规则 针对 rustfmt version 1.4.36 版本
11+
如需了解在稳定版 Rust 中使用未稳定配置项的方法、配置示例及其他全局配置项说明,请参阅:[Rustfmt 配置相关说明](./../Appendix/tools/rustfmt.md)
1212

1313

1414
## 列表
1515

16-
- [P.FMT.01 始终使用 rustfmt 进行自动格式化代码](./fmt/P.FMT.01.md)
17-
- [P.FMT.02 缩进始终使用空格(space)而非制表符(tab)](./fmt/P.FMT.02.md)
16+
- [P.FMT.01 使用 rustfmt 进行自动格式化代码](./fmt/P.FMT.01.md)
17+
- [P.FMT.02 缩进使用空格(space)而非制表符(tab)](./fmt/P.FMT.02.md)
1818
- [P.FMT.03 行间距最大宽度空一行](./fmt/P.FMT.03.md)
19-
- [P.FMT.04 语言项(Item) 定义时花括号(brace)位置应该与语言项保持同一行](./fmt/P.FMT.04.md)
19+
- [P.FMT.04 语言项(Item) 定义时左花括号(brace)位置应该与语言项保持同一行](./fmt/P.FMT.04.md)
2020
- [P.FMT.05 存在多个标识符时应该保持块状(Block)缩进](./fmt/P.FMT.05.md)
21-
- [P.FMT.06 当有多行表达式操作时,操作符应该置于行首](./fmt/P.FMT.09.md)
22-
- [P.FMT.07 枚举变体和结构体字段相互之间默认左对齐](./fmt/P.FMT.10.md)
23-
- [P.FMT.08 多个函数参数和导入模块的布局](./fmt/P.FMT.11.md)
24-
- [P.FMT.09 空格使用规则](./fmt/P.FMT.12.md)
25-
- [P.FMT.10 match 分支格式](./fmt/P.FMT.14.md)
26-
- [P.FMT.11 导入模块分组规则](./fmt/P.FMT.15.md)
27-
- [P.FMT.12 声明宏分支格式](./fmt/P.FMT.16.md)
28-
- [P.FMT.13 具名结构体字段初始化时字段名最好不要省略](./fmt/P.FMT.17.md)
29-
- [P.FMT.14 extern 外部函数需要显式指定 ABI](./fmt/P.FMT.18.md)
30-
- [P.FMT.15 解构元组的时候允许使用`..`来指代剩余元素](./fmt/P.FMT.19.md)
31-
- [P.FMT.16 不要将多个不相关的派生(Derive)宏合并为同一行](./fmt/P.FMT.20.md)
21+
- [P.FMT.06 当有多行表达式操作时,操作符应该置于行首](./fmt/P.FMT.06.md)
22+
- [P.FMT.07 枚举变体和结构体字段都应左对齐](./fmt/P.FMT.07.md)
23+
- [P.FMT.08 函数参数超过五个或导入模块个数超过四个需换行](./fmt/P.FMT.08.md)
24+
- [P.FMT.09 不同的场景,使用不同的空格风格](./fmt/P.FMT.09.md)
25+
- [P.FMT.10 `match` 分支应该具有良好的可读性](./fmt/P.FMT.10.md)
26+
- [P.FMT.11 导入模块分组应该具有良好的可读性](./fmt/P.FMT.11.md)
27+
- [P.FMT.12 声明宏分支应该具有良好的可读性](./fmt/P.FMT.12.md)
28+
- [P.FMT.13 具名结构体字段初始化时不要省略字段名](./fmt/P.FMT.13.md)
29+
- [P.FMT.14 extern 外部函数需要显式指定 ABI](./fmt/P.FMT.14.md)
30+
- [P.FMT.15 解构元组的时候允许使用`..`来指代剩余元素](./fmt/P.FMT.15.md)
31+
- [P.FMT.16 不要将多个不相关的派生(Derive)宏合并为同一行](./fmt/P.FMT.16.md)

src/safe-guides/code_style/fmt/P.FMT.01.md

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
## P.FMT.01 始终使用 rustfmt 进行自动格式化代码
1+
## P.FMT.01 使用 rustfmt 进行自动格式化代码
22

33
**【描述】**
44

5-
应该总是在项目中添加 `rustfmt.toml``.rustfmt.toml`文件,即使它是空文件。这是向潜在的合作者表明你希望代码是自动格式化的。
5+
应该总是在项目中添加 `rustfmt.toml``.rustfmt.toml`文件。即使它是空文件,这是向潜在的合作者表明你希望代码是自动格式化的。
66

77
**【例外】**
88

@@ -72,12 +72,3 @@ fn main() {
7272
}
7373
```
7474

75-
**【Lint 检测】**
76-
77-
| lint name | Clippy 可检测 | Rustc 可检测 | Lint Group |是否可定制|
78-
| ------ | ---- | --------- | ------ | ------ |
79-
| _ | no | no | _ | yes |
80-
81-
【定制化建议】
82-
83-
通过检测 项目 根目录下是否存在 `rustfmt.toml``.rustfmt.toml` ,如果没有该文件,则发出警告,让开发者使用 rustfmt 来格式化代码。

src/safe-guides/code_style/fmt/P.FMT.02.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1-
## P.FMT.02 缩进始终使用空格(space)而非制表符(tab)
2-
1+
## P.FMT.02 缩进使用空格(space)而非制表符(tab)
32

43
**【描述】**
54

6-
1. 缩进要使用 四个 空格,不要使用制表符(`\t`)代替。
7-
2. 通过 IDE/Editor 为缩进默认好设置值。
5+
缩进要使用四个空格,不要使用制表符(`\t`)代替。可以通过 IDE 或编辑器把缩进设置为四个空格。
86

97
**【rustfmt 配置】**
108

11-
此规则 Clippy 不可检测,由 rustfmt 自动格式化。
12-
13-
rustfmt 配置:
14-
159
| 对应选项 | 可选值 | 是否 stable | 说明|
1610
| ------ | ---- | ---- | ---- |
1711
| [`tab_spaces`](https://rust-lang.github.io/rustfmt/#tab_spaces) | 4| yes(默认)| 缩进空格数|

src/safe-guides/code_style/fmt/P.FMT.03.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
fn foo() {
1111
println!("a");
1212
}
13-
// 1
14-
// 2
13+
// 不符合:空两行
14+
// 不符合:空两行
1515
fn bar() {
1616
println!("b");
17-
// 1
18-
// 2
17+
// 不符合:空两行
18+
// 不符合:空两行
1919
println!("c");
2020
}
2121
```
@@ -26,7 +26,7 @@ fn bar() {
2626
fn foo() {
2727
println!("a");
2828
}
29-
// 1
29+
// 符合:空一行
3030
fn bar() {
3131
println!("b");
3232
println!("c");
@@ -41,18 +41,14 @@ fn foo() {
4141
}
4242
fn bar() {
4343
println!("b");
44-
// 1
44+
// 符合:空一行
4545
println!("c");
4646
}
4747

4848
```
4949

5050
**【rustfmt 配置】**
5151

52-
此规则 Clippy 不可检测,由 rustfmt 自动格式化。
53-
54-
rustfmt 配置:
55-
5652
| 对应选项 | 可选值 | 是否 stable | 说明 |
5753
| ------ | ---- | ---- | ---- |
5854
| [`blank_lines_lower_bound`](https://rust-lang.github.io/rustfmt/?#blank_lines_lower_bound) | 0(默认) | No| 不空行|
Lines changed: 32 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,35 @@
1-
## P.FMT.04 语言项(Item) 定义时花括号(brace)位置应该与语言项保持同一行
1+
## P.FMT.04 语言项(Item) 定义时左花括号(brace)位置应该与语言项保持同一行
22

33
**【描述】**
44

5-
花括号的位置风格默认使用 `SameLineWhere`,但是也根据不同的语言项略有区别。
5+
为了保持代码结构的良好可读性,Rust 中定义各种语言项,包括控制结构(`if / match` 等)、函数、结构体、枚举等,要求左花括号与其定义保持同一行。
6+
7+
但是如果携带 `where`语句,则要求换行,并且`where` 子句和 `where` 关键字不在同一行。
8+
9+
`rustfmt` 提供三个配置项对不同的语言项进行格式化:
10+
11+
- `brace_style` 配置项对应于大部分语言项,包括函数、结构体等,但是控制结构(`if / match`等)除外,默认值为`SameLineWhere`,代表左花括号与语言项定义保持同一行。
12+
- `where_single_line` 配置项对应于 `where` 语句,默认值是 `false`,表示 `where`语句的花括号是换行。
13+
- `control_brace_style` 配置项对应于控制结构(`if / match`等),默认值为`AlwaysSameLine`,表示左花括号与语言项定义保持同一行。
14+
15+
所以,只需要使用 `rustfmt` 默认配置即可。
616

717
**【反例】**
818

9-
如果设置 `brace_style = "AlwaysNextLine"`则:
19+
如果设置 `brace_style = "AlwaysNextLine"`则不符合。
1020

1121
```rust
22+
// 不符合: 左花括号与函数语言项定义未保持同一行
1223
fn lorem()
1324
{
1425
// body
1526
}
16-
17-
fn lorem(ipsum: usize)
18-
{
19-
// body
20-
}
21-
22-
fn lorem<T>(ipsum: T)
23-
where
24-
T: Add + Sub + Mul + Div,
25-
{
26-
// body
27-
}
2827
```
2928

30-
如果设置 `brace_style = "PreferSameLine"`
29+
如果设置 `brace_style = "PreferSameLine"`则符合
3130

3231
```rust
33-
fn lorem() {
34-
// body
35-
}
36-
37-
fn lorem(ipsum: usize) {
38-
// body
39-
}
40-
32+
// 不符合: 左花括号与 where 语句 应该换行
4133
fn lorem<T>(ipsum: T)
4234
where
4335
T: Add + Sub + Mul + Div, { // 注意这里和 `SameLineWhere`的区别
@@ -48,30 +40,21 @@ where
4840
结构体与枚举:
4941

5042

51-
如果设置 `brace_style = "AlwaysNextLine"`
43+
如果设置 `brace_style = "AlwaysNextLine"`则不符合
5244

5345

5446
```rust
47+
// 不符合: 左花括号与结构体语言项定义未保持同一行
5548
struct Lorem
5649
{
5750
ipsum: bool,
5851
}
59-
60-
struct Dolor<T>
61-
where
62-
T: Eq,
63-
{
64-
sit: T,
65-
}
6652
```
6753

68-
如果设置 `brace_style = "PreferSameLine"`
54+
如果设置 `brace_style = "PreferSameLine"`则符合
6955

7056
```rust
71-
struct Lorem {
72-
ipsum: bool,
73-
}
74-
57+
// 不符合: 左花括号与 where 语句应该换行
7558
struct Dolor<T>
7659
where
7760
T: Eq, {
@@ -81,10 +64,11 @@ where
8164

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

84-
如果设置 `brace_style = "AlwaysNextLine"`
67+
如果设置 `brace_style = "AlwaysNextLine"`则不符合
8568

8669
```rust
8770
fn main() {
71+
// 不符合: 左花括号与控制结构未保持同一行
8872
if lorem
8973
{
9074
println!("ipsum!");
@@ -96,64 +80,36 @@ fn main() {
9680
}
9781
```
9882

99-
如果设置 `brace_style = "ClosingNextLine"`,则:
100-
101-
```rust
102-
fn main() {
103-
if lorem {
104-
println!("ipsum!");
105-
} // 注意这里 if 分支结尾处,else 换行
106-
else {
107-
println!("dolor!");
108-
}
109-
}
110-
```
111-
11283

11384
**【正例】**
11485

11586
函数:
11687

11788
```rust
118-
fn lorem() { // 花括号和fn定义在同一行
89+
// 符合: 左花括号和 函数语言项定义在同一行
90+
fn lorem() {
11991
// body
12092
}
12193

122-
fn lorem(ipsum: usize) { // 花括号和fn定义在同一行
123-
// body
124-
}
125-
126-
// 当有 `where` 子句的时候,花括号换行
127-
// 并且,`where` 子句和 `where` 关键字不在同一行
12894
fn lorem<T>(ipsum: T)
129-
where
95+
where // 符合:`where` 子句和 `where` 关键字不在同一行
13096
T: Add + Sub + Mul + Div,
131-
{
132-
// body
133-
}
134-
```
135-
136-
通过配置 `where_single_line` 为 true,方可设置 `where`子句在同一行,如下:
137-
138-
```rust
139-
// 当有 `where` 子句的时候,花括号换行
140-
// 设置了 `where_single_line=true` ,则`where` 子句和 `where` 关键字在同一行
141-
fn lorem<T>(ipsum: T)
142-
where T: Add + Sub + Mul + Div,
143-
{
97+
{ // 符合:当有 `where` 子句的时候,花括号换行
14498
// body
14599
}
146100
```
147101

148102
结构体与枚举
149103

150104
```rust
105+
// 符合
151106
struct Lorem {
152107
ipsum: bool,
153108
}
154109

110+
// 符合
155111
struct Dolor<T>
156-
where
112+
where
157113
T: Eq,
158114
{
159115
sit: T,
@@ -163,6 +119,7 @@ where
163119
流程控制倾向于默认使用 `AlwaysSameLine`,即,总在同一行。因为流程控制没有`where`子句。
164120

165121
```rust
122+
// 符合
166123
// "AlwaysSameLine" (default)
167124
fn main() {
168125
if lorem {
@@ -175,15 +132,11 @@ fn main() {
175132

176133
**【rustfmt 配置】**
177134

178-
此规则 Clippy 不可检测,由 rustfmt 自动格式化。
179-
180-
rustfmt 配置:
181-
182135
| 对应选项 | 可选值 | 是否 stable | 说明 |
183136
| ------ | ---- | ---- | ---- |
184137
| [`brace_style`](https://rust-lang.github.io/rustfmt/?#brace_style) | SameLineWhere (默认)| No| 应该与语言项保持同一行,但是 where 语句例外 |
185138
|[`brace_style`](https://rust-lang.github.io/rustfmt/?#brace_style)| AlwaysNextLine | No | 应该在语言项的下一行 |
186139
|[`brace_style`](https://rust-lang.github.io/rustfmt/?#brace_style)| PreferSameLine | No | 总是优先与语言项保持同一行,where 语句也不例外 |
187140
|[`where_single_line`](https://rust-lang.github.io/rustfmt/?#where_single_line)| false(默认)| No | 强制将 `where` 子句放在同一行上 |
188-
|[`brace_style` in control-flow](https://rust-lang.github.io/rustfmt/?#AlwaysSameLine)| AlwaysSameLine (默认) | No | 总在同一行上,用于控制流程中默认值 |
189-
|[`brace_style` in control-flow](https://rust-lang.github.io/rustfmt/?#ClosingNextLine)| ClosingNextLine| No | 用于控制流程中 else 分支在 if 分支结尾处换行|
141+
|[`control_brace_style` in control-flow](https://rust-lang.github.io/rustfmt/?#control_brace_style)| AlwaysSameLine (默认) | No | 总在同一行上,用于控制流程中默认值 |
142+
|[`control_brace_style` in control-flow](https://rust-lang.github.io/rustfmt/?#control_brace_style)| ClosingNextLine| No | 用于控制流程中 else 分支在 if 分支结尾处换行|

0 commit comments

Comments
 (0)