跳到主要内容

❗️ 隐式约定

警告
  • Rust 是强规范语言, 有些规范是隐式的, 有些规范是显式的.
  • 很多语言都存在隐式约定, 拿 python 举例:
    • python 的缩进(4个空格)
    • __init__ 方法: 类初始化
    • __init__.py 文件: 常模块批量导出, 用于区分一个普通目录 vs python module, 且必须存在
    • self 参数: 类方法的第一个参数
  • Rust 中, 有大量隐式约定, 从编译工具链, cargo 工具, 语言语法设计, 都有大量隐式约定.
    • src/: 项目源码目录
      • src/main.rs: 用于存放主程序
      • src/lib.rs: 用于存放库文件
      • src/bin/: 用于存放多个主程序(非常隐式, 虽然是官方规范, 但个人不建议使用, 更建议采用 substrate 的做法)
    • cargo.toml: 项目配置文件, 包含非常灵活+强大+复杂的配置规则(吊打其他语言)
    • mod.rs: 用于存放模块文件, 常用于批量导出 rust modules
    • build.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.