rust学习(5)

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模块树

  1. Package(包即项目) :cargo new my_project创建一个my_project Package(项目)
  2. Crate(单元包):一个模块树,它可以产生一个library文件或者一个binary文件
  3. 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);
 }

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/120238229