观看B站软件工艺师杨旭的rust教程学习记录,有删减有补充
包和模块
Package 包
Cargo
特性,构建、测试、共享crate
- 一个
package
包含一个Cargo.toml
- 一个
package
只能包含0-1个library
(库),lib.rs
- 可以包含任意数量的
binary
,main.rs
- 必须至少包含一个
library
或binary
使用包
1、在Cargo.toml
的[dependencies]
2、使用use
将包导入到作用域
Crate 单元包
一个模块树,它可以产生一个library或可执行文件
crate
是指一个Rust项目或库(library)的单独编译单元(binary)create
可以是一个二进制可执行文件或一个库(库可以是动态链接库或静态链接库)- 每个
crate
都有自己的名称和根目录,其中包含了与该 crate 相关的源代码文件、配置文件和其他资源 crate
可以包含多个module
,module
是代码组织和封装的单元,用于将相关的功能组织在一起src/main.rs
:是源代码文件,Rust编译器从这里开始,就是binary crate
的crate root
src/lib.rs
:是linary crete
的crate root
使用cargo new test_cargo
项目,这里只有一个binary crate
,创建src/bin
可以存放多个binary crate
Module 模块
mod
关键字建立module
use
use
控制代码的组织、作用域、私有路径(函数、方法、struct、enum、module、常量默认私有)- 使用函数时引用函数的父级module
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
//使用函数时引用函数的父级module
use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
- 使用函数以外例如struct、enum等指定完整路径
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, 2);
}
pub use
导入函数的同时导出函数
mod private_module {
pub fn private_function() {
println!("私有函数");
}
}
//导入函数的同时导出,让外部可以调用私有函数
pub use crate::private_module::private_function;
fn main() {
private_function(); // 通过 pub use 导出的函数可以在主模块中直接调用
}
嵌套路径清理use
use std::cmp::Ordering;
use std::io;
use std::io::Write;
//简化为
use std::{cmp::Ordering, io, self};
as
as
关键字可以为引入的路径指定本地的别名
use std::fmt::Result;
use std::io::Result as IoResult;
fn f1() -> Result {}
fn f2() -> IoResult {}
fn main() {}
Path
为struct
、function
、module
等命名的方式
- 绝对路径:从
crate root
开始,也就是src/main.rs
或src/lib.rs
或src/bin/
下的crate
- 相对路径:从当前
module
开始,使用self
、super
或当前module
的标识符 - 路径至少有一个标识符组成,标识符之间使用
::
front_of_house
和eat_at_restaurant
在同一个lib.rs
内,所以拥有同一个crate root
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
pub fn eat_at_restaurant() {
//绝对路径:根据crate root定位
crate::front_of_house::hosting::add_to_waitlist();
//相对路径:根据module这个同级目录定位
front_of_house::hosting::add_to_waitlist();
}
}
super
super
用来访问父级路径的内容
fn serve_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
//super直接调用父级方法
super::serve_order();
//绝对路径调用父级方法
crate::serve_order();
}
fn cook_order() {}
}