【RUST】项目结构

2023-05-16

module systems

概述

主要包含三个部分:

package 下面是 crate
crate 下面是 module

crates

crate 是一个binary或者library,一个crate一般是一类方法

package

一个package包含多个crate,其中至多一个library类型的crate,binary类型的不限

而且一个package必须含有一个crate,不管啥类型

当使用cargo new的时候,cargo就创建了一个cargo.toml文件,如下:

caibin@caibin-MS-7C82:~/my/rust$ cargo new bincai
     Created binary (application) `bincai` package

里面重点有两个文件,其中cargo.toml定义了这个package

Cargo.toml
./src/main.rs

main.rs就是crate的root,它是一个binary类型的,并与package名称相等,也就是crate的名字叫做bincai

如果里面还有个lib.rs,就是含有一个library类型的,并与package名称想等

另外,在src/bin目录下,可以放置多个binary类型的crate

modules

访问权限

首先,我们要知道,module是在crate里面的,然后把crate组织成不同的模块以方便管理,另外,mod要注意一下访问权限,rust所有条目的默认权限是private

加入我们调用一个方法,我们需要知道它的path,path又分为绝对路径和相对路径,下面就是绝对路径和相对路径的例子,但是下面的例子由于访问权限问题是错误的:

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

pub fn eat_at_restaurant() {
    // Absolute path
    crate::front_of_house::hosting::add_to_waitlist();

    // Relative path
    front_of_house::hosting::add_to_waitlist();
}
  • 绝对路径以crate开头的,其实crate就像linux里面的/
  • 相对路径就是以具体的name开头

绝对路径和相对路径使用哪个要看代码如何变动,有的时候相对路径好,比如俩一起搬家

刚刚说了,上面的代码是错误的,那怎么是正确的呢?

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

pub fn eat_at_restaurant() {
    // Absolute path
    crate::front_of_house::hosting::add_to_waitlist();

    // Relative path
    front_of_house::hosting::add_to_waitlist();
}

为什么front_of_house前面不需要public???是由于eat_at_restaurant和它在同一个module里面

super关键字的用法

super就是linux中的…的意思,就像下面这样使用

fn serve_order() {}

mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::serve_order();
    }

    fn cook_order() {}
}
struct和enum的访问权限
struct

我们把pub加到struct,但是struct里面的每个属性还是私有的

enum

如果我们把public加到enum上,那么里面所有属性都是pub的

use方法

内部use

use可以让我们不用写太长的,下面我们引入的是hosting这个module,引用也可以是相对地址

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

use crate::front_of_house::hosting; //注意use到hosting,所以下面还需要写上hosting

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

同时,我们也可以直接引入到对应的方法,

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

use crate::front_of_house::hosting::add_to_waitlist;

pub fn eat_at_restaurant() {
    add_to_waitlist();
    add_to_waitlist();
    add_to_waitlist();
}

引入上一级的好处时,加入我们需要两个同名type,来自不同的上级,这样就可以同时引用,就像下面这样都是result但是来源不同:

use std::fmt;
use std::io;

fn function1() -> fmt::Result {
    // --snip--
}

fn function2() -> io::Result<()> {
    // --snip--
}

也可以使用AS来解决这个问题

use std::fmt::Result;
use std::io::Result as IoResult;

fn function1() -> Result {
    // --snip--
}

fn function2() -> IoResult<()> {
    // --snip--
}

我们可以在use前面加上pub,这样其他的地方也可以调用

外部use

使用外部package我们需要先在cargo.toml里面加上

合并导入

比如导入可以使用{}一行导入多个

// --snip--
use std::cmp::Ordering;
use std::io;
// --snip--

// 可以缩减成下面的形式
// --snip--
use std::{cmp::Ordering, io};
// --snip--

将module拆分到多个文件

当modules很多的时候,我们可以拆分到 其他文件,比如下面这个例子:

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();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

我们就可以把front_of_house拆分到另外一个rs文件里面src/front_of_house.rs

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

然后lib.rs变成:

mod front_of_house;

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【RUST】项目结构 的相关文章

  • TCP三次握手、四次挥手过程及原理

    TCP建立连接为什么是三次握手 xff0c 而不是两次或四次 xff1f TCP xff0c 名为传输控制协议 xff0c 是一种可靠的传输层协议 xff0c IP协议号为6 顺便说一句 xff0c 原则上任何数据传输都无法确保绝对可靠 x
  • 详解 Windows自带的MPIO(多路径)

    windows的MPIO 1 在双活系统中 xff0c 常常为客户端配置多路径 xff0c 来保证业务可持续 xff0c 那今天我们来聊聊windows自带的MPIO 2 首先先教大家如何安装windows自带的MPIO xff08 1 x
  • Docker 不适合跑 MySQL 的 N 个原因

    容器的定义 xff1a 容器是为了解决 在切换运行环境时 xff0c 如何保证软件能够正常运行 这一问题 目前 xff0c 容器和 Docker 依旧是技术领域最热门的词语 xff0c 无状态的服务容器化已经是大势所趋 xff0c 同时也带
  • HTTP状态码100、200、300、400、500、600的含义

    HTTP状态码 HTTP Status Code 是当我们访问网页服务器 xff0c 服务器做出相应的状态的3位数的数字代码 主要包括 1xx xff08 消息 xff09 2xx xff08 成功 xff09 3xx xff08 重定向
  • 人败皆因懒,事败皆因傲,家败皆因奢

    古人讲究 修身 齐家 治国 平天下 中国五百年来可以做到此话的人 xff0c 前有王阳明 xff0c 后有曾国藩 曾国藩在仕途看尽了人世兴衰 xff0c 看透了得失成败 xff0c 他曾专门写下家书 xff0c 告诫家族子弟三句话 xff1
  • 为什么 kubernetes 环境要求开启 bridge-nf-call-iptables

    Kubernetes 环境中 xff0c 很多时候都要求节点内核参数开启 bridge nf call iptables sysctl w net bridge bridge nf call iptables 61 1 参考官方文档 Net
  • Debian配置ssh并限制只有指定主机的指定用户可登录

    Debian服务器IP xff1a 192 168 200 129 Debian客户端IP xff1a 192 168 200 131 Debian默认安装了openssh client xff0c 所以服务器端只需要安装openssh s
  • 什么是真正的转运?常见的五种转运方法

    转运在玄学中的含义和大家想有所不同 xff0c 转运在玄学指日月星辰的移动 xff0c 如王充 论衡 说日 xff1a 然而日出上日入下者 xff0c 随天转运 在玄学中还有三元九运之说 xff0c 此皆是星之变化 于天转运是星象改变 xf
  • 微软各系列软件中 MSDN 、 RTM 、 OEM 、 VOL 各版本的含义和区别

    关注系统的朋友会发现 xff0c 微软正式版本的系统往往带有不同的 名号 xff0c 主要分为MSDN版 xff0c RTM版 xff0c OEN版 xff0c 在过去的操作系统中还有VOL版本 xff0c 经常听这几个名词 xff0c 却
  • 部署私有笔记管理系统(为知笔记)

    免费版仅创建5个用户 https hub docker com r wiznote wizserver span class token function docker span run name wz note restart span
  • 树莓派镜像烧录以及使用vscode开发

    树莓派镜像烧录以及使用vscode开发 烧录镜像 1 下载烧录软件 xff08 balenaEtcher下载地址 xff09 2 下载树莓派镜像 下载地址 这里也提供了博主的镜像 下载慢的同学可以看看 下载链接 3 插入sd卡 xff0c
  • gradle指定相应JDK编译

    问题描述 电脑中装有多个jdk版本 xff0c 可能默认的jdk是1 6 xff0c 但是项目中用到了俗称钻石语法的结构就是 lt gt 这玩意 但是由于你装的某些软件必须在1 6版本下才能跑 xff0c 因此你不想更改的你的JAVA HO
  • 无线路由器的连接与设置

    无线路由器的连接与设置 实验目的 掌握无线路由器基础知识掌握无线路由器设置学会使用设备连接无线路由器 实验环境 无线路由器 xff08 FAST迅捷 FW313R xff09 台式机 无线设备 实验内容 1 设置无线路由器上网方式为 固定I
  • 浅谈 PHY 芯片 UTP 接口直连(不使用变压器)的设计

    浅谈 PHY 芯片 UTP 接口直连 xff08 不使用变压器 xff09 的设计 1 背景 xff1a 一个项目 xff0c 需要把IP101GR模块的UTP接口和交换机芯片 xff08 RTL8305NB xff09 的 UTP 接口连
  • 千万不要去外国当程序员

    今天我来讲讲我这样的一个普通程序员是如何从有想法 xff0c 到实施 xff0c 到最后来到欧洲务工的 整个过程很曲折 xff0c 文章有点长 xff0c 大家给点耐心 如果看不下去请直接翻到最后 xff0c 有总结 个人背景 为了避免有人
  • 逻辑思维能力选择题30道

    逻辑思维能力选择题30道 这些题目都是作者选取于网络 xff0c 靠自己动脑做出来的是最棒的 1 有一个有钱人想让你和他玩一个游戏 xff0c 你在纸上写下一句话 xff0c 并作出选择 选择1 xff1a 如果你写的是实话 xff0c 那
  • 单位换算表大全

    长度 1千米 km 61 0 621英里 mile 1米 m 61 3 281英尺 ft 61 1 094码 yd 1丝米 dmm 61 1忽米 cmm 61 1丝 61 0 01毫米 61 0 001厘米 1厘米 cm 61 0 394英
  • Debian配置CA_配置Apache2使用ssl_配置http连接自动跳转到https

    需要使用到两台Debian服务器 xff0c 一台作为ca端 xff0c 一台作为Apache端 ca端IP xff1a 192 168 200 129 Apache端IP xff1a 192 168 200 131 以下是CA端配置 xf
  • 重量(计量单位)英文缩写和转换表

    重量的缩写是W 一 质量单位换算 xff1a 1长吨 xff08 long ton xff09 61 1 016吨 xff08 t xff09 1千克 xff08 kg xff09 61 2 205磅 xff08 lb xff09 1磅 x
  • 逻辑学三大定律是什么?

    逻辑思维三大定律 同一律 xff0c 矛盾律 xff0c 排中律 同一律 xff1a A 是 A 前后思维中 xff0c 概念要同一 白马非马论违反同一律 商家的买一赠一 xff0c 前后两个一不是同一个概念 违反同一律 矛盾律 xff1a

随机推荐

  • 逻辑学三大定律

    1 同一律就是前后提及概念 论题要是同一个 xff0c 不是同一个就是不合逻辑的 看这句话 xff0c 人有几百万年的历史 xff0c 你没有几百万年的历史 xff0c 所以你不是人 xff0c 典型的三段论 xff0c 大前提 xff0c
  • LeetCode:移除元素

    给你一个数组 nums 和一个值 val xff0c 你需要 原地 移除所有数值等于 val 的元素 xff0c 并返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素的顺序
  • C#高级特性(反射)

    今天来讲解反射的应用 xff1a 一 反射是什么 xff1f 简诉一下 xff0c 反射就是 Net Framework 的一个帮助类库 xff0c 可以获取并使用metadata xff08 元数据清单 xff09 xff1b 说的通俗易
  • Linux 操作命令 c

    1 打开终端的快捷键 ctr 43 alt 43 t 2 终端字体放大 ctr 43 shift 43 43 3 终端字体缩小 ctr 43 4 ls 查看当前目录的下文件信息 5 pwd 当前当前目录的路径 6 touch 创建一个文件
  • java实现平面4点最小距离

    已知平面上若干个点的坐标 需要求出在所有的组合中 xff0c 4个点间平均距离的最小值 xff08 四舍五入 xff0c 保留2位小数 xff09 比如有4个点 xff1a a b c d 则平均距离是指 xff1a ab ac ad bc
  • 【HTTPS】TLS/SSL握手失败的场景分析

    0 背景知识 TLS SSL握手的过程参考 SSL握手过程图解 1 常见报错 1 1 SSLHandshakeException handshake failure 1 1 1 TLS SSL协议版本不匹配 自从TLS 1 2版本在2008
  • 使用RKE部署Rancher v2.5.8 HA高可用集群

    文章目录 一 了解 Rancher1 关于Helm2 关于RKE3 关于K3S4 Rancher 名词解释4 1 仪表盘4 2 项目4 3 多集群应用4 4 应用商店4 5 Rancher Server URL4 6 RKE 模板4 7 G
  • SQL练习题

    网上有一篇关于SQL的经典文章 xff0c 超经典SQL练习题 xff0c 做完这些你的SQL就过关了 xff0c 引用和分析它的人很多 xff0c 于是今天复习SQL的时候找来练了练手 原作者用的是SQL Server 2008 xff0
  • VS2015编译报MS8020错误

    新装的VS2015 xff0c 调试旧的代码报错 xff0c 信息如下 xff1a MSB8020 The build tools for v120 Platform Toolset 61 39 v120 39 cannot be foun
  • 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)

    传送门 思路 xff1a 嗐 xff0c 又是这种模拟题 xff0c 每次都不长记性看数据范围 xff0c 非得傻傻的去循环模拟T一次才知道思考 呜呜呜太菜了 既然每次至少拿出m xff0c 且求的是最多次数 xff0c 那我们每次就拿m出
  • ffmpeg/libavformat/tcp.c中getaddrinfo在IOS下的问题

    IOS的播放器用了ffmpeg 3 1 发现不支持ipv6 跟踪到ffmpeg libavformat tcp c下的getaddrinfo函数 xff0c 发现执行完之后 xff0c 如果是由ipv4合成ipv6的时候 会把端口设成0 所
  • iOS UIImagePickerController 自定义导航条背景、标题和按钮的颜色

    UIImagePickerController span class token operator span imagePickerController span class token operator 61 span span clas
  • centos7.9安装mysql8.0-参考官网简易安装文档,简洁且必成功

    目录 文章目录 目录一 前面的话二 环境三 选择什么下载安装方式四 安装过程1 到官网选择合适的yum repositoty版本2 把这个rpm包下载下来3 使用yum工具添加这个mysql的yum repo4 安装mysql5 启动服务器
  • Mysql8.0设置允许远程连接

    Mysql8 0设置允许远程连接 1 登录mysql 2 选择mysql数据库 3 修改user表使其root用户可以通过远程连接 4 刷新权限 1 登录mysql mysql uroot p 1 2 选择mysql数据库 user mys
  • C/C++经典例题:百钱百鸡

    c 43 43 程序 百钱买百鸡 的解法 题型介绍 xff1a 百鸡问题是一个数学问题 xff0c 出自中国古代约5 6世纪成书的 张邱建算经 xff0c 是原书卷下第38题 xff0c 也是全书的最后一题 xff0c 该问题导致三元不定方
  • 通过storyboard的exit返回到上页

    一般用于model的方式打开页面的关闭 xff0c 在要退回的页面的实现函数 xff1a 64 IBAction span class hljs keyword func span span class hljs built in clos
  • Java接入sqlserver的一些坑点记录

    问题 xff1a 1 Java对应sqlserver的jdbc版本 jdbc对应的maven版本 xff1a 网上搜索出来的资料有两种 xff0c 一种是比较老版本的 lt dependency gt lt groupId gt com m
  • MySql的主从复制,读写分离(配置详解)

    引出问题 xff1a 当系统中MySql服务器只有一个 如果磁盘损坏 xff0c 数据库宕机 xff0c 整个MySql不可用 MySql服务器压力比较大 解决方案 xff1a 主从复制 xff0c 读写分离 xff1a 一个是MySql主
  • 经典排序之选择排序(最大值、最小值)

    选择排序 Select Sort 找到待排序数据里的最小值 最大值放入到对应位置 假如待排序数据为12 xff0c 8 xff0c 1 xff0c 9 xff0c 3 xff0c 我们假设开始时下标为0的元素是最大元素max 第一趟 xff
  • 【RUST】项目结构

    module systems 概述 主要包含三个部分 package 下面是 crate crate 下面是 module crates crate 是一个binary或者library 一个crate一般是一类方法 package 一个p