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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/473955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 深度学习第二版(GPT 重译)(一)

前言 序言 如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学…

MATLAB三维图形的绘制

1,三维曲线 plot3(x,y,z)通过描点连线画出曲图,这里x,y,z都是n维向量,分别表示该曲线上点集的横坐标,纵坐标,竖坐标。 t0:pi/50:10*pi; subplot(121),plot3(sin(t),cos(t),t); subplot(122),fplot3((t)sin(t),(t)cos…

Linux集群

前言: 环境准备:虚拟机,xshell,mysql,tomcat,jdk,centos 虚拟机安装centos可以参考博客:虚拟机安装centos 一,安装jdk 打开xshell 点击cftp,如果没有安装…

HarmonyOS(鸿蒙)应用开发——(一)

目录 1 创建hellopro项目 2 了解ArkTS 3 了解ArkTS的组件 4 组件介绍 4.1 常用基础组件: 4.1.1 Text 4.1.2 Button 4.1.3 TextInput 4.2 容器组件 4.2.1 Column 4.2.2 Row 5 案例——实现一个简易登录页面 5.1 在实现预览效果之前,我们…

记录开发STM32遇到的卡死问题-串口

背景:以STM32作为主控,广州大彩显示屏显示,主控实时采集数据,串口波特率115200.设置收发频率为50Hz,即单片机每秒发送50帧数据,每秒接收50帧数据,每帧数据大概14字节。 问题:系统长…

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展

在一项旨在显著改善 DeFi 生态的战略举措中,Cronos 与 Covalent Network(CQT)携手合作,以期待 Cronos zkEVM 的推出。这一整合,预计将进一步降低以太坊生态系统的交易成本、提升交易速度,并带来更好的交易体…

ZnO非线性电阻片功率损耗的频率特性

对不同频率正弦交流电压作用下直流氧化锌阀片的功率损耗进行了测量。图3.16(a)和(b)分别为试品类型A和试品类型B两种直流ZnO阀片在不同频率电压作用下的功率损耗随荷电率变化的特性。两种阀片的功率损耗都随频率和荷电率的增加而增加。当频率达到1kHz或以上时,阀片的功率损耗增…

SQLiteC/C++接口详细介绍sqlite3_stmt类(二)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) sqlite3_reset() 功能:重置一个准备好执行的SQL语…

IDEA之This license XXXX has been suspended

IDEA激活码突然报如下错误: This license XXXXX has been suspended. Please contact your license administrator 解决方案: IDEA版本2022.2.3,亲测管用

【机器学习智能硬件开发全解】(十一)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的链接过程】

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 机器学习智能硬件开发全解 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 前言 我们回顾一下上篇文章: 【机器学习…

软件企业在咨询第三方软件测试机构报价时,应提前准备什么资料?

近年来,随着软件行业的迅速发展,软件企业对于软件质量的重视程度日益增加。为了确保软件产品的质量以及用户的满意度,越来越多的企业倾向于委托第三方软件测试机构进行测试工作。在咨询第三方软件测试机构报价之前,软件企业需要提…

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

风速预测(八)VMD-CNN-Transformer预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

【实例】React 组件传值方法: Props、回调函数、Context、路由传参

React原始传值方法 借用状态管理库的传值见下篇文:MobX 和 Redux 【实例】React 状态管理库 MobX Redux 入门及对比 文章目录 React原始传值方法父组件->子组件 props子组件->父组件 回调函数Context路由传值 父组件->子组件 props 父组件可以通过属性&a…

sheng的学习笔记-AI-Inception network

目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 构建卷积层时,你要决定过滤器的大小究竟是11(原来是13,猜测为口误),33还是55,或者要不要添加池化层。而Inception网络的作用就是代替你来决定&…

流畅的 Python 第二版(GPT 重译)(一)

前言 计划是这样的:当有人使用你不理解的特性时,直接开枪打死他们。这比学习新东西要容易得多,不久之后,活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters,传奇的核心开发者&am…

【数据结构】——线性表(顺序表加链表),万字解读(加链表oj详解)

前言 由于之前存在过对两者的区别考虑,所以把他们放在一起来说,更加容易区别和理解 对于有关线性表的概念这里就不展示了,这里主要是介绍线性表里面的这两个结构的知识点 一.顺序表 1.顺序表介绍 顺序表的存储结构和逻辑结构都是相邻的&a…

前端知识点03(JS)

文章目录 前端知识点03(JS)1、JS中this指向问题2、script中的async和defer的区别3、setTimeOut和setInterval4、Es6和ES5的区别5、ES6的新特性 🎉写在最后 前端知识点03(JS) hello hello~ ,这里是 code袁~&…

SpringCloud-Feign远程调用

使用Feign替代RestTemplate进行远程服务调用&#xff1a; 远程调用配置 1. 引入依赖 我们在order-service服务的pom文件中引入feign的依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…

spring MVC是如何找到html文件并返回的?

Spring MVC 搜索路径 启动一个SpringBoot项目时&#xff0c;访问http://localhost:8080&#xff0c;对于SpringMVC&#xff0c;它会默认把这段url看成http://localhost:8080/index.html&#xff0c;所以这两个url是等价的。 .html, .css, .js, .img …都是静态资源文件&#x…