7.5 use关键字 Pt.2 :重导出与换国内镜像源教程
7.5.1. 使用pub use重新导出名称
使用use将路径导入作用域内后,该名称在词法作用域内是私有的。
以 7.4. use关键字 Pt.1:use的使用与as关键字 的代码为例:
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_restaurant下使用的add_to_waitlist外部代码是看不见的,因为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.5.2. 使用外部的包(package)
首先要在Cargo.toml里添加依赖项的包(package)名与版本,而Cargo会从crates.io这个网站上下载这个包和这个包的依赖项到本地(也可以用野生的crate,去GitHub找,但非常不建议这么做)。然后就是在代码里使用use将特定条目引入到作用域。
还记得 2.2. 猜数游戏 Pt.2 生成随机数 吗?那时候我们需要rand包来生成随机数,现在我们还是以引入rand包来举例:
Step 1:修改Cargo.toml
打开项目的Cargo.toml文件,在[dependencies]下写上包名和版本,中间用=连接,如下:
[package] name = "RustStudy" version = "0.1.0" edition = "2021" [dependencies] rand = "0.8.5"Step 2:在源代码中引入包
你想用包下的什么东西就用use指定对应的路径来引入即可。这里我需要生成随机数的方法,所以要把Rng这个 trait 引入作用域,引入这行的代码如下:
use rand::Rng;Rust语言的标准库std也被当作是外部的包,但是它已经内置在Rust语言内了,所以就不需要在Cargo.toml里增加依赖项了,直接在源代码中用use引入就行,这有点类似于Python中的re、os、ctype这类库。
比如说我们想要引入std下的collections模块的HashMap这个结构体,就应该写:
use std::collections::HashMap;但不用修改Cargo.toml。
7.5.3. 使用嵌套路径清理大量的use语句
有的时候使用同一个包或模块下的多个条目,前面部分都是一样的,但是还是得写几遍,占用几行,如果引入的东西比较多,需要写很多遍,根本不现实,所以Rust允许使用嵌套路径在同一行内来简化引入的代码。类似于bash的花括号展开特性。
其格式如下:
use 同样的部分::{不同的部分1, 不同的部分2, ...}看个例子:
use std::cmp::Ordering; use std::io;它们有公共的部分std,所以就可以用嵌套路径写为:
use std::{cmp::Ordering, io};如果其中一个引用是另外一个引用的子路径,Rust还允许在使用嵌套路径时使用self关键字,如下例:
use std::io; use std::io::Write;这部分就可以简写为:
use std::io::{self, Write};7.5.4. 通配符*
使用*可以把路径中所有的公共条目都引入到作用域。比如我想把std库下collections模块所有的公共条目都引入进去,就可以这么写:
use std::collections::*;但是这种引入要非常谨慎的使用,通常不这样用。
它的应用场景是:
- 在测试的时候把所有被测试的代码引入到test模块
- 有时候被用于预导入(prelude)模块
7.5.5. 给Rust依赖项下载换源
由于crates.io的网站在国外,所以国内下载很慢,可以换成清华大学镜像。
注意:Cargo 读取的配置文件在用户目录下的.cargo里,而不是项目根目录。Windows 上默认路径是%USERPROFILE%\.cargo\config.toml(也就是用户文件夹下的.cargo\config.toml)。
打开Windows Terminal(Win11自带,Win10需要去微软商店里下载,不花钱),先确保.cargo目录存在,然后进入该目录:
mkdir %USERPROFILE%\.cargo cd %USERPROFILE%\.cargo如果还没有配置文件,可以新建一个(文件名推荐config.toml;如果文件已经存在,不要用下面这条命令覆盖,直接编辑即可):
type nul > config.toml编辑它:输入如下指令,回车:
vim config.toml把这段贴进去(清华大学当前推荐的稀疏索引写法;需要 Cargo 1.68 及以上):
[source.crates-io] replace-with = 'tuna' [source.tuna] registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"把光标(不是鼠标指针!)下移,从
移到
然后输入
:wq再按回车就会保存。
然后再重新build你的项目就可以。