Rust项目结构

文章目录

  • 一、module模块
    • 1.二进制文件的cargo项目
    • 2.库的cargo项目
      • 模块中使用crate关键字
      • 模块中使用super
      • 模块中结构体的访问规则
      • 模块中枚举的访问规则
      • 模块中use关键字
      • 不同模块定义了相同类型冲突解决办法
      • 使用pub use导出本模块的函数给外面模块
      • 引入外部依赖
      • 模块与子模块
    • 小结
    • 3.文件内的module
  • 二、模块化项目结构
    • 1.关于module
    • 2.各个模块之间互相引用
  • 三、推荐项目结构
    • 1.实例
  • 参考

一、module模块

在这里插入图片描述

crate规则:

  • 规则一:一个包中必须至少包含一个crate
  • 规则二:一个包中可以不包含库crate或者包含1个库crate
    规则三:一个包中可以包含任意数量的二进制crate

1.二进制文件的cargo项目

bin下面一个rs文件就是一个crate
在这里插入图片描述

2.库的cargo项目

模块中使用crate关键字

mod front_of_house {pub mod hosting {pub fn add_to_waitlist() {}}
}pub fn eat_at_restaurant() {// 绝对路径// 使用crate的原因是:// crate 的被称为 模块树 的模块结构的根部:https://rustwiki.org/zh-CN/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.htmlcrate::front_of_house::hosting::add_to_waitlist();// 相对路径front_of_house::hosting::add_to_waitlist();
}

模块中使用super

fn serve_order() {}mod back_of_house {fn fix_incorrect_order() {cook_order();// 访问父模块的函数super::serve_order();}fn cook_order() {}
}

模块中结构体的访问规则

mod back_of_house {pub struct Breakfast {//结构体成员默认是私有的pub toast: String,pub seasonal_fruit: String,}impl Breakfast {pub fn summer(toast: &str) -> Breakfast {Breakfast {toast: String::from(toast),seasonal_fruit: String::from("peaches"),}}}
}pub fn eat_at_restaurant() {// 在夏天点一份黑麦面包作为早餐let mut meal = back_of_house::Breakfast::summer("Rye");// 更改我们想要的面包meal.toast = String::from("Wheat");println!("I'd like {} toast please", meal.toast);meal.seasonal_fruit = String::from("blueberries");let meal2 = back_of_house::Breakfast {toast: String::from("Wheat"),seasonal_fruit: String::from("strawberries"),};
}

模块中枚举的访问规则

mod back_of_house {// 枚举前面加上pub即可pub enum Appetizer {Soup,Salad,}
}pub fn eat_at_restaurant() {let order1 = back_of_house::Appetizer::Soup;let order2 = back_of_house::Appetizer::Salad;
}

模块中use关键字

use关键字将路径引入到作用域中

mod front_of_house {pub mod hosting {pub fn add_to_waitlist() {}}
}//在一个模块里面,也可以直接使用self,use self::front_of_house::hosting;
// 函数:use引用其父亲模块,对于struct和enum则建议全部引入进来
use crate::front_of_house::hosting;pub fn eat_at_restaurant() {hosting::add_to_waitlist();
}
fn main() {}

不同模块定义了相同类型冲突解决办法


// 引入父模块
use std::fmt;
use std::io;fn function1() -> fmt::Result {// --snip--
}fn function2() -> io::Result<()> {// --snip--
}

// 通过重命名解决
#![allow(unused)]
fn main() {
use std::fmt::Result;
use std::io::Result as IoResult;fn function1() -> Result {// --snip--Ok(())
}fn function2() -> IoResult<()> {// --snip--Ok(())
}
}

使用pub use导出本模块的函数给外面模块

mod front_of_house {pub mod hosting {pub fn add_to_waitlist() {}}
}pub use crate::front_of_house::hosting;pub fn eat_at_restaurant() {hosting::add_to_waitlist();
}
fn main() {}

引入外部依赖

在这里插入图片描述

使用外部依赖

use rand::Rng;fn main() {let secret_number = rand::thread_rng().gen_range(1..101);
}

模块与子模块

在这里插入图片描述

将front_of_house.rs中的子模块hosting定义在另外一个文件中,先创建front_of_house子目录,然后创建hosting.rs文件

在这里插入图片描述

模块是可以定义在同级的另外一个文件中的,如上所示,librs的mod front_of_house;

子模块是定义在以父模块为名的目录中的,如上所示,可以在front_of_house.rs模块中使用其子模块hosting.rs。

小结

1。Rust的模块系统概念包括:包package,包装箱crate,模块module和路径path。模块系统的目标是有效组织目录。
2。crate是Rust中的一个编译单元,它可以是一个二机制crate,也可以是一个库crate
3。cargo new缺省创建的是二进制项目,可以通过–bin指定创建二进制项目,或者–Lib~指定创建库项目
4。一个包package可以由一个或者多个crate组成。它包含一个Cargo。toml文件,其中可以定义它所包含的crates
5。一个包最多只能有一个库crate,可以有任意多个二进制crate。但是一个包中必须至少有一个crate。
6。模块类似名字空间,可以逻辑拆分和组织代码。模块用关键字mod定义,模块可以是public也可以是private的。
7。缺省情况下,模块是private私有的,可以添加pub关键字,将一个模块设置为public的。模块中可以嵌套子模块。
8。路径path用于访问一个模块中定义的项。路径可以是相对的,也可以是绝对的。

3.文件内的module

关键字:mod

引入模块中的方法

  • usemod名字:方法名
  • usemod名字.*
  • 写全路径

二、模块化项目结构

·好处

  • 使源代码管理更加方便
  • 更方便读

1.关于module

默认是private

组成一个module

  • File
  • Directory,需要mod.rs

2.各个模块之间互相引用

crate根目录引入
super相对路径引入

三、推荐项目结构

bin目录

  • 把main.rs放入

somelib

  • 需要修改Cargo.toml
[somelib]
name =“somelib"
path=“src/somelib/mod.rs”I  //文件夹
path=“src/somelib/some.rs” //单个文件

1.实例

创建一个项目

创建一个库mlib

  • 创建单文件translate模块
  • 创建music目录模块
    mp3
    flac
    在flac调用translate模块中的方法
    将flac中的music方法暴露出去

在这里插入图片描述

main.rs

fn main() {println!("Hello, world!");mlib::translate::func1();mlib::music::flac::flac();mlib::music::flac::flac_music();mlib::test();mlib::flac_music();
}

src/mlib/music/flac.rs

pub fn flac() {//方法1 调用外层translate.rs里面的方法super::super::translate::func1();println!("flac");
}pub fn flac_music() {// 方法2crate::translate::func1();println!("flac_music");
}

src/mlib/music/mod.rs

// 声明出去pub mod flac;
pub mod mp3;

src/mlib/music/mp3.rs

pub fn mp3() {println!("mp3");
}

src/mlib/mod.rs


// 暴露模块
pub mod music;
pub mod translate;pub fn test() {println!("test....");
}// 暴露模块中的某个函数
pub use music::flac::flac_music;

src/mlib/translate.rs

pub fn func1() {println!("Hello,  func1!");
}

Cargo.toml

[package]
name = "demo"
version = "0.1.0"
edition = "2021"[lib]
name="mlib"
path="src/mlib/mod.rs"[dependencies]

参考

  • Rust项目结构

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-字符串常量池

在Java程序中&#xff0c;类似于&#xff1a;1&#xff0c; 2&#xff0c; 3&#xff0c;3.14&#xff0c;“hello”等字面类型的常量经常频繁使用&#xff0c;为了使程序的运行速度更快、 更节省内存&#xff0c;Java为8种基本数据类型和String类都提供了常量池。 1.为什么要…

【Python爬虫实战】深入解锁 DrissionPage:ChromiumPage 自动化网页操作指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、ChromiumPage基础操作 &#xff08;一&#xff09;初始化Drission 和 ChromiumPage 对象 &#xff0…

无人机之姿态融合算法篇

无人机的姿态融合算法是无人机飞行控制中的核心技术之一&#xff0c;它通过将来自不同传感器的数据进行融合&#xff0c;以实现更加精确、可靠的姿态检测。 一、传感器选择与数据预处理 无人机姿态融合算法通常依赖于多种传感器&#xff0c;包括加速度计、陀螺仪、磁力计等。这…

基于SSM的图书馆座位预约系统+lw示例参考

#1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、座位管理、座位分类管理、图书馆管理、预约信息管理、退座管理、系统管理等&#xff09;、普通用户&#xff08;信息查看、图书馆管理、个人中心、座位预约等&#xff09;技…

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章&#xff1a;数据库水平扩展第二章&#xff1a;中台战略第三章&#xff1a;阿里分布式服务架构HSF&#xff08;high speed Framework&#xff09;、早期Dubbo第四章&#xff1a;共享服务中心建设原则第五章&#xff1a;数据拆分实现数据库能力线性扩展第六章&am…

鸿蒙的进击之路

1. 题记&#xff1a; 为什么要写鸿蒙&#xff0c;因为她是华为的&#xff0c;为什么是华为就要写&#xff0c;因为华为背负了国人太多太多的包袱&#xff0c;或点赞或抨击。 我是强烈支持华为的&#xff0c;但我会客观公正地去评价华为的产品&#xff0c;就比如这篇博文&#…

【CTFN】基于耦合翻译融合网络的多模态情感分析的层次学习

同样用了翻译模块的论文->MTMSA 代码地址->github地址 abstract 多模态情感分析是一个具有挑战性的研究领域&#xff0c;涉及多个异构模态的融合。主要的挑战是在多模式融合过程中出现一些缺失的模式。然而&#xff0c;现有的技术需要所有的模态作为输入&#xff0c;因…

Go的环境搭建以及GoLand安装教程

目录 一、开发环境Golang安装 二、配置环境变量 三、GoLand安装 四、Go 语言的 Hello World 一、开发环境Golang安装 官方网址&#xff1a; The Go Programming Language 1. 首先进入官网&#xff0c;点击Download&#xff0c;选择版本并进行下载&#xff1a; ​ ​ 2. …

Spring IoC DI

1. IoC 1.1 容器 容器是用来容纳某种物品的&#xff08;基本&#xff09;装置。——来自&#xff1a;百度百科 生活中的水杯&#xff0c;垃圾桶&#xff0c;冰箱等等&#xff0c;都是容器 代码中的容器&#xff0c;如&#xff1a;List/Map -> 数据存储容器&#xff1b;T…

Python异常检测 - LSTM(长短期记忆网络)

系列文章目录 Python异常检测- Isolation Forest&#xff08;孤立森林&#xff09; python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子&#xff08;LOF&#xff09;算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

DolphinDB 与南方科技大学联合授课啦!

11月1日&#xff0c;南方科技大学商学院和 DolphinDB 联合举办了高校课程讲座。讲座由南方科技大学商学院高级研究学者冯鹏举主持&#xff0c;DolphinDB 创始人兼 CEO 周小华博士、某百亿私募数据平台架构师潜蛟老师进行精彩演讲。 Part 1 : 大数据时代下数据库架构革新与生态…

3.PyCharm工具

第三方IDE&#xff0c;集成开发工具&#xff0c;官网下载。 社区版本&#xff0c;免费使用。 创建项目

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【在Linux世界中追寻伟大的One Piece】poll代码改写

目录 1 -> poll代码改写 1 -> poll代码改写 结合select代码&#xff0c;将select server更改成为pollserver&#xff0c;不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…

【11月10日最新】V2.6.1版本植物大战僵尸杂交版分享与下载

&#x1f447;下载链接&#xff1a; 点击下载 更新内容 植物大战僵尸杂交版2.6.1版本的更新内容主要包括以下几个方面&#xff1a; 梦幻联动&#xff1a; 与UP主轻柔北风合作&#xff0c;推出了“植物大战僵尸贴吧版”。联动植物包括石果子与雷蘑菇杂交的雷果子&#xff0c;…

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

路过宝安乌石岩庙记

​每周带娃从上屋地铁去罗租大道的七彩城堡儿童乐园玩&#xff0c;路上都会经过乌石岩庙附近。听说香火很繁盛&#xff0c;娃说也想去看看&#xff0c;于是来到了乌石岩庙。 石岩乌石岩庙 广东省深圳市宝安区老街一区94号 ​从百度知悉&#xff1a;乌石岩庙&#xff0c;又称“…

练习LabVIEW第四十四题

学习目标&#xff1a; 计算学生三门课(语文&#xff0c;数学&#xff0c;英语)的平均分&#xff0c;并根据平均分划分成绩等级。要求输出等级A,B,C,D,E。90分以上为A&#xff0c;80&#xff5e;89为B&#xff0c;70&#xff5e;79为C&#xff0c;60&#xff5e;69为D&#xff…

软考高级架构 - 8.1 - 系统质量属性与架构评估 - 超详细讲解+精简总结

第8章 系统质量属性与架构评估 软件系统属性包括功能属性和质量属性&#xff0c;而软件架构重点关注质量属性。 8.1 软件系统质量属性 8.1.1 概述 软件系统的质量反映了其与需求的一致性&#xff0c;即&#xff1a;软件系统的质量高低取决于它是否能满足用户提出的需求&#…