[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
实用知识
装箱crates
我们今天来讲讲装箱技术crates。
什么是crates?
英语翻译是:
英 [kreɪt] 美 [kreɪt]
- n. 板条箱;篓
- vt. 将某物装入大木箱或板条箱中
[ 过去式 crated 过去分词 crated 现在分词 crating 复数 crates 第三人称单数 crates ]
其实,它也就是一种模块化封装技术。
我们还是来看看代码,我们先用命令:cargo new greetings 生成一个新的工程,工程目录如下 :
// # It generates,
greetings
├── Cargo.toml
└── src
└── main.rs
然后我们用vscode打开这个目录,在src目录下,新建一个lib.rs,并写入以下代码:
// 01. greetings/src/lib.rs
pub fn hello() {
println!("Hello, world!");
}
在main.rs文件中写入以下代码:
// 02. greetings/src/main.rs
extern crate greetings;
fn main() {
greetings::hello();
}
然后在当前工程目录下,powershell下运行以下命令:
cargo build
cargo run
打印结果为:Hello, world!
我来解释一下相关代码。
extern crate greetings;
这段代码什么意思呢?它代表链接到一个库:greetings
在Rust,
链接一个 crate 到这个新库,必须使用 extern crate 声明。这不仅会链接库,还会导入与库名相同的模块里面的所有项。适用于模块的可见性规则也适用于库。
这里我们要注意一点:
其中库的名字,不能像这样的加横杠线:“like-this”,而是用下划线:"like_this",如下:
extern crate like_this;
现在有另一种情景,当我们的库越来越大,怎么办?
我们可以把这些库统一放在一个crate中。
我们来看看例子。
先用命令创建相关目录:
// # Think we run,
cargo new phrases
cargo new phrases/greetings --lib
这两个命令将产生如下目录:
// # It generates,
phrases
├── Cargo.toml
├── greetings
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
在目录phrases下的Cargo.toml文件最后一行,加入以下依赖信息:
greetings = { path = "greetings" }
在目录phrases/greetings/src/lib.rs文件中,更新为如下代码:
// 02. phrases/greetings/src/lib.rs
pub fn hello() {
println!("Hello, world!");
}
在目录phrases/src/main.rs文件中,更新为如下代码:
// 03. phrases/src/main.rs
extern crate greetings;
fn main() {
greetings::hello();
}
在工程目录phrases,运行:cargo run,应该会打印出一个正确结果:Hello, world!
我们看到,crate的依赖信息可以写到Cargo.toml文件中,非常方便。
当然,我们可以导入git中的代码库,如下:
/ -- Cargo.toml --
[dependencies]
// 01. Get the latest commit on the master branch
rocket = { git = "https://github.com/SergioBenitez/Rocket" }
// 02. Get the latest commit of a specific branch
rocket = { git = "https://github.com/SergioBenitez/Rocket", branch = "v0.3" }
// 03. Get a specific tag
rocket = { git = "https://github.com/SergioBenitez/Rocket", tag = "v0.3.2" }
// 04. Get a specific revision (on master or any branch, according to rev)
rocket = { git = "https://github.com/SergioBenitez/Rocket", rev = "8183f636305cef4adaa9525506c33cbea72d1745" }
当然我们可以从crate.io中导入依赖,比如我们从这个库:https://crates.io/crates/test_crate_hello_world
我们在依赖文件:目录phrases下的Cargo.toml,更新为如下信息:
[*dependencies*]
*#greetings = { path = "greetings" }*
test_crate_hello_world = "0.1.2"
在目录phrases/src/main.rs文件中,更新为如下代码:
extern crate test_crate_hello_world;
fn main() {
println!("{}", test_crate_hello_world::hello());
}
在工程目录phrases,运行:cargo run,应该会打印出一个正确结果:Hello, world!
以上,希望对你有用。
如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust
参考文章:https://learning-rust.github.io/docs/d4.crates.html
[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]的更多相关文章
- [易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具]
[易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具] 项目实战 实战5:实现BTC价格转换工具 今天我们来开发一个简单的BTC实时价格转换工具. 我们首先 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]
[易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)]
[易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)] 项目实战 实战3:Http服务器 我们今天来进一步开发我们的Http服务器,用多线程实现. 我 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]
[易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)]
[易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)] 项目实战 实战2:命令行工具minigrep 有了昨天的基础,我们今天来开始另一个稍微有点 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏]
[易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏] 项目实战 实战1:猜数字游戏 我们今天来来开始简单的项目实战. 第一个简单项目是猜数字游戏. 简单来说,系统给了 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(5)|生命周期Lifetime]
[易学易懂系列|rustlang语言|零基础|快速入门|(5)] Lifetimes 我们继续谈谈生命周期(lifttime),我们还是拿代码来说话: fn main() { let mut a = ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]
[易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(21)|智能指针]
[易学易懂系列|rustlang语言|零基础|快速入门|(21)|智能指针] 实用知识 智能指针 我们今天来讲讲Rust中的智能指针. 什么是指针? 在Rust,指针(普通指针),就是保存内存地址的值 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理]
[易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理] 实用知识 错误处理 我们今天来讲讲Rust中的错误处理. 很多语言都有自己的错误处理方式,比如,java是异常处理机制. ...
随机推荐
- ASP.NET(C#)事务的创建、提交以及回滚 (附代码)
1.事务是什么? 事务是应用程序中一系列严密的操作,所有的操作必须全部成功完成,否则每个操作中的所有更改都会被撤销.也就是事务具有原子性,一个事务中的一系列操作要么全部成功,要么 ...
- 【Python基础】lpthw - Exercise 47 自动化测试
一.自动化测试的目的 利用自动化的测试代码取代手动测试,使得程序中的一些初级bug可以被自动检出,而无需人工进行重复繁琐的测试工作. 二.编写测试用例 利用上一节编写的skeleton,这次在proj ...
- Linux手册页惯用的节名
节 大写 描述 name NAME 显示命令名和一段简短的描述 synopsis SYNOPSIS 命令的语法 confi guration CONFI GURATION 命令配置信息 descrip ...
- 自然语言处理NLP学习笔记二:NLP实战-开源工具tensorflow与jiagu使用
前言: NLP工具有人推荐使用spacy,有人推荐使用tensorflow. tensorflow:中文译作:张量(超过3维的叫张量)详细资料参考:http://www.tensorfly.cn/ J ...
- 在 Windows 10 上用超级终端配置 Cisco 3560 Series
在Cisco实验中,恢复路由器出厂配置是必须的内容,所以今天就由小编来为大家介绍Cisco软件怎么恢复路由器出厂配置. 1. 通过终端连接交换机1.1. 通过 Windows 的超级终端连接 Cisc ...
- oracle数据段详解
Tablespace(表空间):表空间是数据库的逻辑划分,一个表空间只能属于一个数据库.所有的数据库对象都放在指定的表空间中,但主要存放的对象是表,所以称为表空间. 默认的系统表空间:system.s ...
- kettle An error occurred, processing will be stopped: 错误 解决方法
上午在使用KETTLE时,报了一个 An error occurred, processing will be stopped: 错误,手动跑没有问题,用jekens调用就报错. 具体原因不清楚,后面 ...
- 以石子合并为例的区间DP
区间DP,是一类具有较为固定解法的DP,一般的思路都是: first.初始化区间长度为1的情况(一般区间长度为1的较易于初始化) second. for(枚举区间长度2~n){ for(枚举左端点){ ...
- Html table 插入图像填充整个单元格
把image的display属性设置为block就可以了
- 树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能
需求:首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频 1. 树莓派实现USB存储设备自动挂载 树莓派U ...