Skip to content
On this page

Rust代码组织


标签:rust/basic  

模块系统

Package(包) -> Crate(单元包) -> Module(模块) -> Path(路径)

Package

  • 只包含 1 个 Cargo.toml,描述如何构建 Crates
  • 只能包含 0-1 个 library crate
  • 可以包含任意数量的 binary create
  • 必须至少包含一个 crate (library 或 binary)
  • 可以同时包含 src/main.rs 和 src/lib.rs
  • 可以有多个 binary crate

Crate

  • crate 分为二进制项(binary)和库(library)
  • crate 是 rust 编译时的最小单位
  • crate root 是源文件,是编译器起始点

src/main.rs

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

src/lib.rs

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

Module

  • 在一个 crate 内,将代码分组
  • 增加可读性,复用性
  • 控制项目(item)的私有性。public, private
  • 可嵌套子 module
rust
mod front_of_house {
  mod hosting {
    fn add_to_waitlist() {}
    fn seat_at_table() {}
  }

  mod serving {
    fn take_order() {}
    fn serve_order() {}
    fn take_payment() {}
  }
}

Path

  • 为了找到某个模块,需要使用路径
  • 分为绝对路径和相对路径
  • 绝对路径从 crate root 出发
  • 相对路径从当前模块出发,使用 self, super 或当前模块的标识符
rust
mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}
    }
}

pub fn eat_at_restaurant() {
    // 绝对路径
    crate::front_of_house::hosting::add_to_waitlist();
    // 相对路径
    front_of_house::hosting::add_to_waitlist();
}

私有边界(private boundary)

  • 模块不仅可以组织代码,还可以定义私有边界
  • Rust 中的所有条目默认都是模块私有的
  • 父级模块无法访问子模块中的私有条目
  • 子模块里可以使用祖先模块的所有条目
  • 使用 pub 关键字可以将某些元素设置为公有
  • 同级模块之间可以互相调用

super

  • 当想要调用上一级路径的时候,使用 super,相当于文件系统的 ..

pub

  • pub 放在 struct 前:
    • struct 是公共的
    • struct 的字段默认是私有的
    • struct 的字段需要单独设置 pub 来变成公有
  • pub 放在 enum 前:
    • enum 是公共的
    • enum 的变体也都是公共的

Last updated: