1.模块树和文件树
hhh/src目录同时存在libr.rs与main.rs,此时hhh这个项目或者说是包拥有2个crate
- hhh库crate,crate根为lib.rs
- hhh二进制可执行crate,crate根为main.rs
lib.rs内容为pub mod front_of_house ;
表示定义front_of_house 模块,然后具体定义抽出来具体放到了front_of_house.rs文件中,然后front_of_house.rs文件(即是front_of_house模块)中具体内容为pub mod hosting ;
表示定义了hosting模块,具体定义也抽出来放到了hosting.rs文件中。
先介绍一下hhh库crate的结构,先是hhh库crate的根lib.rs中定义了front_of_house模块,然后front_of_house模块下又定义了hosting模块,hosting模块下定义了两函数,因为add_to_waitlist()和eat_at_restaurant() 在同一父模块下,所以eat_at_restaurant() 中调用add_to_waitlist()时,不用加模块路径。
现在想在main.rs中调用hosting下的add_to_waitlist(),应该在main.rs这样写hhh::front_of_house::hosting::eat_at_restaurant();
,代码里的use语句只是起到缩短书写模块路径的作用。
-
super表示父作用域,即当前所在函数所在模块的外面,有点类似与文件系统里的
..
,ex:cd ../target
表示进入父目录下的target目录 -
self表示当前所在函数所在的模块
1.1模块系统or模块树
- Package(包即项目) :
cargo new my_project
创建一个my_project Package(项目) - Crate(单元包):一个模块树,它可以产生一个library文件或者一个binary文件
- Module(模块):里面可以定义struct , enum, trait, funtion…
层次关系从1->2>3
一个Package
-
包含一个Cargo.toml文件,它描述了如何构建这些Crates
-
只能包含0-1个library crate
-
可以包含任意数量的binary crate。把文件放在src/bin目录下,每个文件都是一个单独的binary crate
-
至少包含一个crate(库crate或者是二进制crate)
Crate的类型:
- library
- binary
Crate Root:
- 是源代码文件
- rust编译器rustc从Crate Root 开始组成你的Crate的根模块
ex:src/main.rs 是binary crate 的crate root, binary crate 的 crate 名与 package 名相同。src/lib.rs 表明该package包含1个library crate,src/lib.rs 是这个library crate 的 crate root , 这个 library crate 的crate 名与包名相同。cargo把 crate root 文件 交给rustc来构建 library crate 和binary crate。
2.tokio使用
//Cargo.toml
[dependencies]
tokio = {
version = "1.10", features = ["full"] }
//除了使用crate std(std库)里的东西不用写到Cargo.toml文件里,其他情况都需要写Cargo.toml的依赖项里,并且在main.rs 顶端还需要加use或者extern把第三方crate导入作用域。use可以用导入作用域,又可以缩短书写路径
//src/main.rs
use tokio::task;
#[tokio::main]
async fn main() {
let task_num: i32=10;
let mut handle_set: Vec<task::JoinHandle<()>>= Vec::new();
for i in 1..=task_num{
handle_set.push(task::spawn(async move {
println!("my task id is {}",i);
}));
}
for i in handle_set {
i.await.unwrap();//.await是执行future
}
}
3.输出程序花费时间
//Cargo.toml
[dependencies]
time = "0.1"
chrono ="0.4.0"
//src/main.rs
use chrono::DateTime;
use chrono::prelude::*;
fn fib(x: i64) -> i64 {
match x < 2 {
true => x,
_ => fib(x - 2) + fib(x - 1),
}
}
fn main() {
let start: DateTime<Local> = Local::now();
let nums: Vec<i64> = vec![30_i64, 35, 40, 45];
for n in nums {
let value = fib(n);
}
let end : DateTime<Local> = Local::now();
let smills: i64 = start.timestamp_millis();
let emills: i64 = end.timestamp_millis();
let dur=emills-smills;
println!("Done ! \nTime : {} ms",dur);
4.自定义trait
struct Student {
name: String,
age: u32,
}
struct Teacher {
name: String,
sub: String,
age: u32,
}
trait SchoolName {
fn get_school_name(&self) ->String {
String::from("csust")
}
}
impl SchoolName for Teacher{
fn get_school_name(&self) ->String {
String::from("njiu")
}
}
impl SchoolName for Student{
}
fn main(){
let stu1 = Student {
name : "zl".to_string(),
age: 21,
};
let tea1 = Teacher {
name : "tjf".to_string(),
sub: "math".to_string(),
age: 50,
};
println!("hhh");
let stu1_school_name=stu1.get_school_name(); //Student类型使用的get_school_name()是SchoolNmeTrait中的默认实现
let tea1_school_name=tea1.get_school_name();//Teacher类型使用的get_school_name()是SchoolNmeTrait的自定义实现
let sum_name = format!("student's school :{} and teacher's school : {}",stu1_school_name,tea1_school_name);
println!("{}",sum_name.len());
println!("{}",sum_name);
println!("{} {}",stu1_school_name,tea1_school_name);
}