1,Cargo包
项目是最大的分类。一个项目对应一个Cargo.toml。
创建项目的指令:
cargo new demo1
其中,demo1是项目名。效果:
https://crates.io/上存放了很多Cargo项目,可以直接拿来使用。
我们也可以上传自己的项目。
2,crate
crate类似于文件,分类仅次于项目。
有两种crate:exe,lib。
exe有main函数,编译产物可以运行。
lib是库文件,可以被其他crate引入。
3,包和crate的关系
一个包里面:
- lib可以有0个或者1个。
- exe可以有任意个。
- 至少有一个crate,无论是lib还是exe。
lib的默认名称为:lib.rs。
exe则是:main.rs。
其他exe需要放在src/bin目录下。
举例:
只有main.rs的时候。
只有一个exe文件,名称和项目名一致。
多了一个lib.rs。
多了一个libdemo1.rlib。
在src/bin中新建一个a.rs。写好main方法。
多了一个exe文件,名称就是a。
4,模块
模块可以进一步拆分代码。像这样:
mod a {
mod b {
mod c {}
}
mod d {
fn say() {
println!("你好,世界!");
}
}
}
fn main() {
}
外部想要访问say(),需要pub来公开。
pub mod a {
mod b {
mod c {}
}
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
}
fn main() {
a::d::say();
}
4.1绝对路径写法
三方库,以库名作为开头。
当前库,以crate开头。
pub mod a {
mod b {
mod c {}
}
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
}
mod m {
fn asd() {
crate::a::d::say();
}
}
fn main() {}
4.2相对路径写法
可以直接从当前路径开始写。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
fn c() {
d::say();
}
}
fn main() {}
super代表父模块。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
mod m {
fn c() {
super::d::say();
}
}
}
fn main() {}
5,use
use可以把某个名称引入当前位置。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
}
fn main() {
use a::d::say;
say();
}
可以改名。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
}
fn main() {
use a::d::say as say2;
say2();
}
可以把名称也公开,让外部可以从这里use。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
}
pub use d::say;
}
fn main() {
a::say();
}
两句类似的use可以简写。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
pub fn say2() {
println!("你好,世界!");
}
}
}
fn main() {
use a::d::{say, say2};
say();
say2();
}
也可以use所有的。
pub mod a {
pub mod d {
pub fn say() {
println!("你好,世界!");
}
pub fn say2() {
println!("你好,世界!");
}
}
}
fn main() {
use a::d::*;
say();
say2();
}
6,模块的拆分
准备一个main.rs。
pub mod m {
pub fn abc() {
println!("你好,世界!")
}
}
fn main() {
m::abc();
}
想要把模块m单独放在一个地方。只需要:
1,src下新建m.rs,放下代码。
pub fn abc() {
println!("你好,世界!")
}
2,原来的地方替换成空壳。
pub mod m;
fn main() {
m::abc();
}
7,子模块的拆分
还是上面的代码,在m中套一层n。
pub mod n {
pub fn abc() {
println!("你好,世界!")
}
}
想要把模块n单独放在一个地方。只需要:
1,新建目录m,里面新建n.rs。
pub fn abc() {
println!("你好,世界!")
}
2,原来的地方替换成空壳。