【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
7.4.1. 使用pub use重新导入名称
使用use将路径导入作用域内后。该名称在词作用域内是私有的。
以上一篇文章的代码为例:
mod front_of_house { pub mod hosting { pub fn add_to_waitlist() { } fn seat_at_table() { } }
} use crate::front_of_house::hosting::add_to_waitlist; pub fn eat_at_restaurant() { add_to_waitlist();
}
对于外部代码来说,eat_at_restaurant是可以访问到的,因为它在声明时使用了pub关键字,但eat_at_restuarant下的add_to_wait list外部代码是看不见的,因为use引入默认是私有的。如果想要外部代码也能访问到,就需要在use前增加pub关键字:
mod front_of_house { pub mod hosting { pub fn add_to_waitlist() { } fn seat_at_table() { } }
} pub use crate::front_of_house::hosting::add_to_waitlist; pub fn eat_at_restaurant() { add_to_waitlist();
}
这样子就可以让外部代码访问到use模块了。
当我们想要对外暴露代码的时候,我们可以使用这种技术,不按照内部代码的结构,而是做一些调整来对外进行暴露。这样代码内部的结构和外边看到的可能就会有点不一样。毕竟写代码的人和调用代码的人他们所期望的东西通常是不一样的。
最后总结一下:pub use重导出既可以将该条目引入作用域,也可以使该条目被外部代码引入到它们的作用域。
7.4.2. 使用外部的包(package)
首先要在Cargo.toml里添加依赖项的包(package)名与版本,而Cargo会从crates.io这个网站上下载这个包和这个包的依赖项到本地(也可以用野生的crate,去GitHub找,但非常不建议这么做)。然后就是在代码里使用use将特定条目引入到作用域。
还记得第二章的猜数游戏吗?那时候我们需要rand包来生成随机数,现在我们还是以引入rand包来举例:
Step 1:修改Cargo.toml
打开项目的Cargo.toml文件,在[dependencies]下写上rand这个包名和指定的版本,中间用=连接,如下:
[package]
name = "RustStudy"
version = "0.1.0"
edition = "2021" [dependencies]
rand = "0.8.5"
Step 2:在源代码中引入包
你想用包下的什么东西就用use指定对应的路径来引入即可。这里我需要生成随机数的函数,所以就引入这个函数的父级模块Rng,引入这行的代码如下:
use rand::Rng;
Rust语言的标准库std也被当作是外部的包,但是它已经内置在Rust语言内了,所以就不需要在Cargo.toml里增加依赖项了,直接在源代码中用use引入就行,这有点类似于Python中的re、os、ctype这类库。
比如说我们想要引入std下的collectiond模块的HashMap这个结构体,就应该写:
use std::collections::HashMap;
但不用修改Cargo.toml。
7.4.3. 使用嵌套路径清理大量的use语句
有的时候使用同一个包或模块下的多个条目,前面部分都是一样的,但是还是得写几遍,占用几行,如果引入的东西比较多,需要写很多遍,根本不现实,所以Rust允许使用嵌套路径在同一行内来简化引入的代码。类似于bash的花括号展开特性。
其格式如下:
use 同样的部分::{不同的部分1, 不同的部分2, ...}
看个例子:
use std::cmp::Odering;
use std::io;
它们有公共的部分std,所以就可以用嵌套路径写为:
use std::{cmp::Odering, io};
如果其中一个引用是另外一个引用的子路径,Rust还允许在使用嵌套路径时使用self关键字,如下例:
use std::io;
use std::io::Write;
这部分就可以简写为:
use std::io::{self, Write};
7.4.4. 通配符*
使用*可以把路径中所以的公共条目都引入到作用域。比如我想把std库下collections模块所有的公共条目都引入进去,就可以这么写:
use std::collections::*;
但是这种引入要非常谨慎的使用,通常不这样用。
它的应用场景是:
- 在测试的时候把所有被测试的代码引入到
test模块 - 有时候被用于预导入(prelude)模块
7.4.5. 给Rust依赖项下载换源
由于crates.io的网站在国外,所以国内下载很慢,可以换成清华大学镜像。
打开Windows Terminal(Win11自带,Win10需要去微软商店里下载,不花钱),先找到你的项目所在的文件夹路径,然后输入指令,回车:
cd 你的文件夹路径
然后在下面建立一个config配置文件,输入如下指令,回车:
touch config
编辑它:输入如下指令,回车:
vim config
把这段贴进去:
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'tuna'
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
[net]
git-fetch-with-cli = true
把光标(不是鼠标指针!)下移,从

移到

然后输入
:wq
再按回车就会保存。
然后再重新build你的项目就可以。
相关文章:
【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例: m…...
前端学习DAY28(水平)
元素水平方向的布局 元素在其父元素中水平方向的位置有以下几个属性共同决定 margin-left border-left padding-left width padding-right border-right margin-right 一个元素在其父元素中,水平布局必须要满足以下的等式 margin-left border-left …...
【MyBatis】day01搭建MyBatis框架
目录 第一章 初识Mybatis 第二章 搭建Mybatis框架 第三章 Mybatis核心配置详解【mybatis-config.xml】 第一章 初识Mybatis 1.1 框架概述 生活中“框架” 买房子 笔记本电脑 程序中框架【代码半成品】 Mybatis框架:持久化层框架【dao层】 SpringMVC框架&…...
yolov7算法及其改进
yolov7算法及其改进 1、YOLOV7简介2、ELAN架构设计2.1、Partial Residual Networks2.1.1、Masked Residual Layer2.1.2、Asymmetric Residual Layer 2.2、Cross Stage Partial Networks2.2.1、Cross stage partial operation2.2.2、Gradient flow truncate operation 2.3、Effi…...
spring cloud微服务-OpenFeign的使用
OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…...
【汇编】关于函数调用过程的若干问题
1. 为什么需要bp指针? 因为bp是栈帧的起始地址,函数内的局部栈变量,采用相对bp的内存寻址。不能相对于sp,sp是一直在变的。 2. 函数调用过程? 函数开始,先压栈bp,保存父函数栈底指针bp&#…...
针对Kali 系统进行分区设置
手动设置分区 Kali 安装之腾讯云经验遇到坑_腾讯云安装kali-CSDN博客 安装过程中的几处关键点,文字总结如下: ①分区--手动 ②是否创建空的分区表 ---yes ③选择---创建一个新的分区 ④大小--默认-----主分区 ⑤分区类型----系统)一个逻辑分区 ⑥是否…...
C语言简单测试总结
前言 在学C语言之前回顾一下C中的一些知识.选用的是中国大学MOOC中C程序设计(面向对象进阶)中的C语言水平评估测试题. 题目 The keyword "unsigned" can modify the keyword [ B ] A.signed B.long C.long double D.float题解:unsigned是无符号的意识,通常在…...
Android OpenGl(二) Shader
一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…...
【已解决】“Content-Security-Policy”头缺失
1、作用 简称CSP,意为内容安全策略,通过设置约束指定可信的内容来源,降低异源文件攻击,例如:js/css/image等 2、相关设置值 指令名 demo 说明 default-src self cdn.example.com 默认策略,可以应用于js文件/图片…...
win系统B站播放8k视频启用HEVC编码
下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置...
快速理解24种设计模式
简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…...
为什么深度学习和神经网络要使用 GPU?
为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…...
Yocto 项目中的交叉编译:原理与实例
Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…...
Python入门:7.Pythond的内置容器
引言 Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器&…...
sqlserver镜像设置
本案例是双机热备,只设置主体服务器(主)和镜像服务器(从),不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC (1)打开SQL Server配置管理器…...
Pandas04
Pandas01 Pandas02 Pandas03 文章目录 内容回顾1 数据的合并和变形1.1 df.append (了解)1.2 pd.concat1.3 merge 连接 类似于SQL的join1.4 join (了解) 2 变形2.1 转置2.2 透视表 3 MatPlotLib数据可视化3.1 MatPlotLib API 套路 &为什么要可视化3.2 单变量可视化3.3 双变量…...
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期࿰…...
c语言中void关键字的含义和用法
在 C 语言中,void 是一个特殊的关键字,主要有以下几个用途: 1. 表示函数没有返回值 当一个函数不需要返回任何值时,可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
