rust编程指南——包管理

Package、Crate和Module

模块系统:

    Package(包):Cargo的特性,让你构建、测试、共享 crate Crate(单元包):一个模块树,它可产生一个 library或可执行文件 Modυle(模块)、Use:让你控制代码的组织、作用域、私有路径 Path(路径):为 struct、 function或 module等项命名的方式

Package和Crate

Crate的类型:

    binary library

Crate root

    是源代码文件 Rust编译器从这里开始,组成你的 Crate的根 Module

一个 Package

    包含1个 Cargo.toml,它描述了如何构建这些 Crates 只能包含0-1个 library crate 可以包含任意数量的 binary crate 但必须至少包含一个 crate( library或 binary)

惯例

src/main. rs:

    binary crate 的 crate root crate名与 package名相同

src/lib. rs:

    package包含一个 library crate library crate 的 crate root crate名与 package名相同

Cargo把 crate root文件交给 rust来构建 library或 binary

一个 Package可以同时包含src/main.rs和src/lib.rs

    一个 binary crate,一个 library crate 名称与 package名相同

一个 Package可以有多个 binary crate:

    文件放在src/bin 每个文件是单独的 binary crate

Module

Module的作用:

    在一个 crate内,将代码进行分组 增加可读性,易于复用 控制项目(iem)的私有性。 public、 private

建立 module:

    mod关键字 可嵌套 可包含其它项( struct、enum、常量、trai、函数等)的定义
//src/lib.rs
mod front_of_house {
    mod hosting {
        fn add_to_waitlist(){}
        fn sear_at_table(){}
    }
    mod serving{
        fn take_order(){}
        fn serve_order(){}
        fn take_payment(){}
    }
}

src/main.rs和src/lib.rs的内容形成了crate模块(隐式模块),位于整个模块树的根部

Path

为了在Rust的模块中找到某个条目,需要使用路径。

路径的两种形式:

    绝对路径:从 crate root开始,使用 crate名或字面值 crate 相对路径:从当前模块开始,使用se!f, sUper或当前模块的标识符
mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist(){}
    }
}

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

私有边界

模块不仅可以组织代码,还可以定义私有边界

如果想把函数或 struct等设为私有,可以将它放到某个模块中

Rust中所有的条目(函数,方法, struct,enum,模块,常量)默认是私有的。

父级模块无法访问子模块中的私有条目

子模块可以使用所有祖先模块的条目

super关键字,访问上级

公共struct中的字段还是私有的,公共enum中的段都是公共的

use关键字

导入模块

as关键字

use std::io::Result as IoResult;

pub use使对外暴露更灵活

使用外部package

Cargo. tom添加依赖的包( package)

    从https://crates.io/下载 Use将特定条目引入作用域

use的使用,嵌套,通配符*

将模块拆分为文件

模块定义时,如果模块名后边是“;”,而不是代码块,rust会从与模块同名的文件中加载内容

//src/lib.rs
mod front_of_house;
pub use crate::front_of_house::hosting;

///src/front_of_house.rs
pub mod hosting;

///src/front_of_house/hosting.rs
pub fn add_to_waitlist(){}
经验分享 程序员 微信小程序 职场和发展