包管理

2023/3/11

# 定义模块

// src/lib.rc
mod front_of_house {
    // 公有模块
    pub mod hosting {
        // 公有方法
        pub fn add_to_waitlist() {}
        fn seat_at_table() {}
    }
    mod serving {
        fn take_order() {}
        fn serve_order() {}
    }
}

pub fn eat_at_restaurant() {
    // 绝对路径
    crate::front_of_house::hosting::add_to_waitlist();
    // 相对路径
    front_of_house::hosting::add_to_waitlist();
}

# super 关键字开始构造相对路径

fn serve_order() {}

mod front_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::serve_order();
    }

    fn cook_order() {}
}

# 结构体或枚举声明为公共

toast 字段公开,⽽使 seasonal_fruit 字段保持私有

mod back_of_house {
    pub struct Breakfast {
        pub toast: String,      // 公有
        seasonal_fruit: String, // 私有
    }
    impl Breakfast {
        pub fn summer(toast: &str) -> Breakfast {
            Breakfast {
                toast: String::from(toast),
                seasonal_fruit: String::from("peaches"),
            }
        }
    }
}

pub fn eat_at_restaurant() {
    // 选择黑麦面包作为夏季早餐
    let mut meal = back_of_house::Breakfast::summer("Rye");

    // 修改面板类型
    meal.toast = String::from("wheat");
    println!("I'd like {} toast please", meal.toast);

    // seasonal_fruit 是私有属性不能访问
    //meal.seasonal_fruit = String::from("blueberries");
}

枚举声明为公共的时,它所有的变体都⾃动变为了公共状态

mod back_of_house {
    pub enum Appetizer {
        Soup,
        Salad,
    }
}

pub fn eat_at_restaurant() {
    let order1 = back_of_house::Appetizer::Salad;
    let order2 = back_of_house::Appetizer::Soup;
}

# use 关键字将路径导⼊作⽤域

示例一:绝对路径导入

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

// 使用绝对路径导入hosting
use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

示例一:相对路径导入

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

// 使用相对路径导入hosting
use self::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

使⽤ as 关键字来提供新的名称

use std::fmt::Result;
use std::io::Result as IoResult;

使⽤ pub use 重导出名称

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

// 重导出名称
pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

使⽤外部包

use rand::Rng;
fn main() {
 let secret_number = rand::thread_rng().gen_range(1, 101);
}

嵌套的路径

// 示例一
use std::cmp::Ordering;
use std::io;

// 简化
use std::{cmp::Ordering, io};


// 示例二
use std::io;
use std::io::Write;

use std::{self,Write}

通配符

use std::collections::*;

将模块拆分为不同的⽂件

// src/front_of_house.rs
pub mod hosting {
    pub fn add_to_waitlist() {}
}
// src/lib.rs

mod front_of_house;

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}