package、crate 、定义module

87 阅读2分钟

1.rust的代码组织

代码组织主要包括:

  • 哪些细节可以暴露,哪些细节是私有的
  • 作用域内哪些名称有效

模块系统:

  • package(包):cargo的特性,可以构建、测试、共享crate
  • crate(单元包):一个模块树,他可以产生一个library或可执行文件
  • module(模块):可以控制代码的组织,作用域,私有路径
  • path(路径): 为struct、function、module等这些命名的方式

2.package crate

crate 的类型:

  • binary
  • library

crate root :

  • 它是源代码文件
  • rust编译器从这里开始,组成crate的根module

package:

  • 包含一个cargo.toml,它描述了如何构建这些crates
  • 可以有多个crate,但只能有一个library crate
  • 可以有任意数量的binary crate
  • 但是必须至少包含一个crate(library crate或binary crate)

3.cargo 的项目结构

src/main.rs

  • binary crate 的 crate root
  • crate名与package名相同

src/lib.rs:

  • package包含一个library crate
  • library crate 的crate root
  • crate名与package名相同

如果有main.rs,那么就有一个binary crate

如果有lib.rs,那么就有一个library crate

他们两个是入口文件

  • cargo 会把这些crate root 文件交给rustc来构建library或binary

  • 一个package可以同时包含src/main.rs和src/lib.rs

    • 一个binary crate,一个library crate
    • 这两个crate名称都与package名称相同
  • 一个package可以有多个binary crate

    • 源代码文件放在src/bin下面
    • 每个文件是单独的binary crate

4.crate的作用

  • 它可以将相关功能组合到一个作用域内,便于在项目间进行分享
  • 可以防止命名冲突

5.定义module来控制作用域和私有性

module

  • 在一个crate内,将代码进行分组
  • 可以增加代码的可读性,易于复用
  • 控制条目的私有性,public,private

建立module

  • mod关键字
  • 可以嵌套
  • 可以包含其他项(struct、enum、常量、trait函数等)的定义
mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}
        fn seat() {}
    }
    
    mod serving {
        fn take_order() {}
    }
}

图片.png

  • src/main.rs和src/lib.rs叫做crate roots,是crate的根
  • 这两个文件的内容都形成了名为crate的模块,位于整个模块树的根部