Nameing Convertions
本文最后更新于 2024-03-29,本文发布时间距今超过 90 天, 文章内容可能已经过时。最新内容请以官方内容为准
Nameing Conventions
-
基本命名规范在 RFC 430 中定义。
-
对于 type-level 的构造,Rust 通常使用驼峰命名法,如:UpperCamelCase。
-
对于 value-level 的构造,Rust 通常使用蛇形命名法,如:snake_case。
命名约定
包
Crates | 不明确
模块
Modules | 蛇形命名法,如:snake_case
类型
Types | UpperCamelCase,如:UpperCamelCase
特征
Traits | UpperCamelCase,如:UpperCamelCase
枚举
Enumerations | UpperCamelCase,如:UpperCamelCase
结构体
Structs | UpperCamelCase,如:UpperCamelCase
函数
Functions | 蛇形命名法,如:snake_case
方法
Methods | 蛇形命名法,如:snake_case
通用构造器
General constructors | new
或 with_more_details
转换构造器
Conversion constructors | from_some_other_type
宏
Macros | 蛇形命名法,如:snake_case!
局部变量
Local variables | 蛇形命名法,如:snake_case
静态类型
Statics | SCREAMING_SNAKE_CASE,如:SCREAMING_SNAKE_CASE
常量
Constants | SCREAMING_SNAKE_CASE,如:SCREAMING_SNAKE_CASE
类型参数
Type parameters | UpperCamelCase,通常使用一个大写字母:T
生命周期
Lifetimes | 通常使用小写字母:'a,'de,'src
Features
Features | unclear but see C-FEATURE
Feature Naming
特征的名称应该使用动词,而不是形容词或者名词,例如 Print
和 Draw
明显好于 Printable
和 Drawable
。
类型转换要遵守 as_
,to_
,into_
命名惯例(C-CONV)。类型转换应该通过方法调用的方式实现,其中的前缀规则如下:
方法前缀 | 性能开销 | 所有权改变 |
---|---|---|
as_ |
Free | borrowed -> borrowed |
to_ |
Expensive | borrowed -> borrowed borrowed -> owned (non-Copy types) owned -> owned (Copy types) |
into_ |
Variable | owned -> owned (non-Copy types) |
例如:
str::as_bytes()
把str
变成 UTF-8 字节数组,性能开销是 0。输入是一个借用的&str
,输出也是一个借用的&str
。Path::to_str()
会执行一次昂贵的 UTF-8 字节数组检查,输入和输出都是借用的。对于这种情况,如果把方法命名为as_str
是不正确的,因为这个方法的开销还挺大。str::to_lowercase()
在调用过程中会遍历字符串的字符,且可能会分配新的内存对象。输入是一个借用的str
,输出是一个有独立所有权的String
。String::into_bytes()
返回String
底层的Vec<u8>
数组,转换本身是零消耗的。该方法获取String
的所有权,然后返回一个新的有独立所有权的Vec<u8>
。
当一个单独的值被某个类型所包装时,访问该类型的内部值应通过 into_inner()
方法来访问。例如将一个缓冲区值包装为 BufReader
类型,还有 GzDecoder
、AtomicBool
等,都是这种类型。
如果 mut
限定符在返回类型中出现,那么在命名上也应该体现出来。例如,Vec::as_mut_slice
就说明它返回了一个 mut
切片,在这种情况下 as_mut_slice
比 as_slice_mut
更适合。
// 返回类型是一个 `mut` 切片
fn as_mut_slice(&mut self) -> &mut [T];
标准库中的一些例子:
Result::as_ref
RefCell::as_ptr
slice::to_vec
Option::into_iter
读访问器 (Getter) 的名称遵循 Rust 的命名。
命名要使用一致性的词序 (C-WORD-ORDER)
这是一些标准库中的错误类型:
JoinPathsError
ParseBoolError
ParseCharError
ParseFloatError
ParseIntError
RecvTimeoutError
StripPrefixError
它们都使用了 谓语 - 宾语 - 错误 的词序,如果我们想要表达一个网络地址无法分析的错误,由于词序一致性的原则,命名应该如下 ParseAddrError
,而不是 AddrParseError
。
词序和个人习惯有很大关系,想要注意的是,你可以选择合适的词序,但是要在包的范畴内保持一致性,就如标准库中的包一样。
以上内容摘选自 Rust 语言圣经:命名规范