❗️ 隐式约定
attention
- Rust 是
强规范
语言, 有些规范是隐式
的, 有些规范是显式
的. - 很多语言都存在
隐式
约定, 拿 python 举例:- python 的
缩进
(4个空格) __init__
方法: 类初始化__init__.py
文件: 常模块批量导出, 用于区分一个普通目录 vs python module, 且必须存在self
参数: 类方法的第一个参数
- python 的
- Rust 中, 有
大量隐式
约定, 从编译工具链, cargo 工具, 语言语法设计, 都有大量隐式约定.src/
: 项目源码目录src/main.rs
: 用于存放主程序src/lib.rs
: 用于存放库文件src/bin/
: 用于存放多个主程序(非常隐式, 虽然是官方规范, 但个人不建议使用, 更建议采用 substrate 的做法)
cargo.toml
: 项目配置文件, 包含非常灵活+强大+复杂的配置规则(吊打其他语言)mod.rs
: 用于存放模块文件, 常用于批量导出 rust modulesbuild.rs
: 用于存放构建脚本
- 这些
隐式
约定, 会给初学者
带来大量困扰.- 经常因为不了解隐含规则, 导致无法理解+编译 rust 项目.
- 虽然
官方文档
都会提及, 但过于分散
(初学者要花很久才触碰到, 但其实入门就应该知道). - 此处, 会将所有隐式约定, 一一列举+说明, 以便初学者快速知晓, 不至于被这些绊倒.
Rust 隐式约定
区分 lib 和 bin.
- lib: 是包/库. 通常是不含有 main 函数的.
- bin: 是可执行文件. 通常是含有 main 函数的.
src/main.rs 是 bin 的入口文件.
src/lib.rs 是 lib 的入口文件.
cargo.toml 隐含的约定:
- [package] 下的 name 字段, 是 lib 的名字.
- [lib] 下的 name 字段, 是 lib 的名字.
- [lib] 下的 path 字段, 是 lib 的入口文件.
- [bin] 下的 name 字段, 是 bin 的名字.
- [bin] 下的 path 字段, 是 bin 的入口文件.
mod.rs 隐含的约定:
mod.rs
类似 python 的__init__.py
文件, 用于批量导出模块.- 用法基本和 python
__init__.py
一致, 但是需要注意的是,mod.rs
文件中的模块, 需要在main.rs
中导出, 才能在main.rs
中使用.
build.rs 隐含的约定:
- TODO
其他隐含的约定:
- main.rs 中, 用
use crate::
导入模块. - lib.rs 中, 用
use super::
导入模块. - lib.rs 中, 用
use crate::
导入模块.
test 隐含的约定:
- mod tests: 用于存放测试代码.
- run test:
cargo test
- run test:
cargo test -- --nocapture
crate 隐含的约定:
- TODO
cargo workspace 隐含的约定:
- workspace: 用于管理多个 crate.
- cargo.toml: 用于管理 workspace.