[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]

释放双眼,带上耳机,听听看~!

[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]

实用知识

装箱crates

我们今天来讲讲装箱技术crates。

什么是crates?

英语翻译是:

英 [kreɪt] 美 [kreɪt]

  • n. 板条箱;篓
  • vt. 将某物装入大木箱或板条箱中

[ 过去式 crated 过去分词 crated 现在分词 crating 复数 crates 第三人称单数 crates ]


其实,它也就是一种模块化封装技术。

我们还是来看看代码,我们先用命令:cargo new greetings 生成一个新的工程,工程目录如下 :


1
2
3
4
5
6
1// # It generates,
2greetings
3 ├── Cargo.toml
4 └── src
5    └── main.rs
6

然后我们用vscode打开这个目录,在src目录下,新建一个lib.rs,并写入以下代码:


1
2
3
4
5
6
1// 01. greetings/src/lib.rs
2pub fn hello() {
3    println!("Hello, world!");
4}
5
6

在main.rs文件中写入以下代码:


1
2
3
4
5
6
7
8
1// 02. greetings/src/main.rs
2extern crate greetings;
3
4fn main() {
5    greetings::hello();
6}
7
8

然后在当前工程目录下,powershell下运行以下命令:


1
2
3
4
1cargo build
2
3cargo run
4

打印结果为:Hello, world!

我来解释一下相关代码。


1
2
1extern crate greetings;
2

这段代码什么意思呢?它代表链接到一个库:greetings

在Rust,

链接一个 crate 到这个新库,必须使用 extern crate 声明。这不仅会链接库,还会导入与库名相同的模块里面的所有项。适用于模块的可见性规则也适用于库。

这里我们要注意一点:

其中库的名字,不能像这样的加横杠线:“like-this”,而是用下划线:"like_this",如下:


1
2
1extern crate like_this;
2

现在有另一种情景,当我们的库越来越大,怎么办?

我们可以把这些库统一放在一个crate中。

我们来看看例子。

先用命令创建相关目录:


1
2
3
4
1// # Think we run,
2cargo new phrases
3cargo new phrases/greetings --lib
4

这两个命令将产生如下目录:


1
2
3
4
5
6
7
8
9
10
1// # It generates,
2phrases
3 ├── Cargo.toml
4 ├── greetings
5 │  ├── Cargo.toml
6 │  └── src
7 │     └── lib.rs
8 └── src
9    └── main.rs
10

在目录phrases下的Cargo.toml文件最后一行,加入以下依赖信息:


1
2
1greetings = { path = "greetings" }
2

在目录phrases/greetings/src/lib.rs文件中,更新为如下代码:


1
2
3
4
5
1// 02. phrases/greetings/src/lib.rs
2pub fn hello() {
3    println!("Hello, world!");
4}
5

在目录phrases/src/main.rs文件中,更新为如下代码:


1
2
3
4
5
6
7
1// 03. phrases/src/main.rs
2extern crate greetings;
3
4fn main() {
5    greetings::hello();
6}
7

在工程目录phrases,运行:cargo run,应该会打印出一个正确结果:Hello, world!

我们看到,crate的依赖信息可以写到Cargo.toml文件中,非常方便。

当然,我们可以导入git中的代码库,如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1/ -- Cargo.toml --
2[dependencies]
3
4// 01. Get the latest commit on the master branch
5rocket = { git = "https://github.com/SergioBenitez/Rocket" }
6
7// 02. Get the latest commit of a specific branch
8rocket = { git = "https://github.com/SergioBenitez/Rocket", branch = "v0.3" }
9
10// 03. Get a specific tag
11rocket = { git = "https://github.com/SergioBenitez/Rocket", tag = "v0.3.2" }
12
13// 04. Get a specific revision (on master or any branch, according to rev)
14rocket = { git = "https://github.com/SergioBenitez/Rocket", rev = "8183f636305cef4adaa9525506c33cbea72d1745" }
15

当然我们可以从crate.io中导入依赖,比如我们从这个库:https://crates.io/crates/test_crate_hello_world

我们在依赖文件:目录phrases下的Cargo.toml,更新为如下信息:


1
2
3
4
5
6
1[*dependencies*]
2
3*#greetings = { path = "greetings" }*
4
5test_crate_hello_world = "0.1.2"
6

在目录phrases/src/main.rs文件中,更新为如下代码:


1
2
3
4
5
6
1extern crate test_crate_hello_world;
2fn main() {
3    println!("{}", test_crate_hello_world::hello());
4}
5
6

在工程目录phrases,运行:cargo run,应该会打印出一个正确结果:Hello, world!

以上,希望对你有用。


1
2
1如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust
2

参考文章:https://learning-rust.github.io/docs/d4.crates.html

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++调用Python

2022-1-11 12:36:11

安全资讯

凤凰新媒体将一点资讯2000万美元贷款转为优先股

2016-12-30 23:54:45

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索