关于Rust的项目结构的笔记

层级

  • Package
  • Crate
  • Module
  • Path

Package

cargo的特性, 构建、测试、共享Crate

组成:

  • 一个 Cargo.toml 文件, 描述了如何构建这些 Crates
  • 至少包含一个 crate
  • 最多只能包含一个 library crate
  • 可以包含任意个 binary crate

cargo new demo-pro

会产生一个名为 demo-pro 的 Package

目录结构如下:
在这里插入图片描述

cargo 的惯例:

  1. src/main.rs 是 binary crate 的 crate root
    且此crate的名称与package名一致

  2. src/lib.rs 是 library crate 的 crate root (此文件需要自己创建)
    且此crate的名称与package名一致

cargo 会把 crate root 文件交给 rustic 来构建 library 或 binary

  1. 一个package 可以有多个 binary crate
    在这里插入图片描述

Crate

一个模块树, 可以产生一个 library 或 可执行文件


Crate 类型:

  • binary 二进制文件
  • library 库文件

Crate Root:

  • 是源代码文件
  • rustc 从这里开始组成项目的根Module

Module

控制代码的组织、作用域、私有路径


  • 在一个 crate 内可以将代码进行分组
  • 易于复用
  • 控制项目私有性
  • 使用 mod 关键字进行创建
  • 可以嵌套
  • 可以包含其他项的定义(struct , enum, trait, fn)

案例1:

src/lib.rs

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() {}
    }
}

在这里插入图片描述

案例2:

src/lib.rs

pub mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
        pub fn seat_at_table() {}
    }

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

pub fn eat_at(){
    crate::front_of_house::hosting::add_to_waitlist();
}

src/main.rs

fn eat_at2(){
    demo_pro::front_of_house::hosting::add_to_waitlist();
}

fn main() {
    eat_at2();
}

案例3: super

src/lib.rs

pub mod front_of_house {

    fn method1() {}

    pub mod hosting {
        fn method2() {}

        pub fn method3() {
            method2();
            super::method1();
            // or
            crate::front_of_house::method1();
        }
    }
}

案例4 use 关键字

src/lib.rs

pub mod front_of_house {

    fn method1() {}

    pub mod hosting {
        fn method2() {}

        pub fn method3() {
            method2();
            super::method1();
            // or
            crate::front_of_house::method1();
        }
    }
}

use crate::front_of_house::hosting;

pub fn eat_at3(){
    hosting::method3();
}

src/main.rs

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, 2);
}

案例5 as 关键字

src/main.rs

use std::collections::HashMap as MyMap;

fn main() {
    let mut map = MyMap::new();
    map.insert(1, 2);
}

案例6 pub use

重新导出

案例7 将模块重新拆分为不同文件

理论:
在这里插入图片描述

  1. 一级拆分 (等同案例4的效果)

在这里插入图片描述

src/lib.rs

pub mod front_of_house;

use crate::front_of_house::hosting;

pub fn eat_at3(){
    hosting::method3();
}

src/front_of_house.rs

fn method1() {}

pub mod hosting {
    fn method2() {}

    pub fn method3() {
        method2();
        super::method1();
        // or
        crate::front_of_house::method1();
    }
}
  1. 二级拆分 (等同案例2的效果)

在这里插入图片描述

src/lib.rs

pub mod front_of_house;

pub fn eat_at(){
    crate::front_of_house::hosting::add_to_waitlist();
}

src/front_of_house.rs

pub mod hosting;

pub mod serving;

src/front_of_house/hosting.rs

pub fn add_to_waitlist() {}
pub fn seat_at_table() {}

src/front_of_house/serving.rs

pub fn take_order() {}
pub fn serve_order() {}
pub fn take_payment() {}

相关推荐

  1. rust 项目文件结构

    2024-03-21 14:46:02       70 阅读
  2. Rust开发笔记 | Rust交互式Shell

    2024-03-21 14:46:02       39 阅读
  3. 关于go和rust语言对比

    2024-03-21 14:46:02       25 阅读
  4. 关于数据结构整理

    2024-03-21 14:46:02       32 阅读
  5. 关于鸿蒙笔记整理

    2024-03-21 14:46:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 14:46:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 14:46:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 14:46:02       87 阅读
  4. Python语言-面向对象

    2024-03-21 14:46:02       96 阅读

热门阅读

  1. CCF编程能力等级认证GESP—C++5级—20240316

    2024-03-21 14:46:02       38 阅读
  2. 【NC235948】最大子串和

    2024-03-21 14:46:02       39 阅读
  3. 【K8s】Kubernetes网络完全指南和CNI讲解

    2024-03-21 14:46:02       41 阅读
  4. 机器学习流程—模型部署发布

    2024-03-21 14:46:02       42 阅读
  5. springboot + neo4j 功能使用

    2024-03-21 14:46:02       37 阅读
  6. 如何建设企业信息化管理体系?

    2024-03-21 14:46:02       33 阅读
  7. TC551001CPI

    2024-03-21 14:46:02       39 阅读
  8. Spring面试题

    2024-03-21 14:46:02       42 阅读