2023学习日志

2023-07-04 15:14:45 浏览数 (1)

rust

包与crate

crate 是rust在编译时的最小代码单位

crate二进制项两种形式

二进制项

二进制项形式的crate被编译为可执行文件,必须具有main函数作为程序执行时的入口。

不需要main函数,也不会编译为可执行文件,主要作用是为二进制项形式的crate提供函数

crate root

crate root为一个源文件,作为crate根模块,编译时以crate root为起点。

是提供功能的一系列crate。包中最多有一个,但可以有任意多二进制项,一个中至少有一个crate。

模块

声明模块

可以在crate root 中声明新的模块编译器将会根据一定的规则查找模块代码

比如,你用mod garden声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码:

  • 内联,在大括号中,当mod garden后方不是一个分号而是一个大括号
  • 在文件 src/garden.rs
  • 在文件 src/garden/mod.rs

声明子模块

可以在除crate root以外的文件中定义子模块编译器会按照类似于查找模块的规则查找子模块代码。

比如,你可能在src/garden.rs中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码:

  • 内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号
  • 在文件 src/garden/vegetables.rs
  • 在文件 src/garden/vegetables/mod.rs

use 引入模块

可以使用use 关键字来引入模块,便于使用模块中的函数。类似于java、js、python中的import关键字。

  • 绝对路径

crate 根(root)开头的全路径;对于外部 crate 的代码,是以 crate 开头的绝对路径,对于对于当前 crate 的代码,则以字面值 crate 开头。

  • 相对路径

从当前模块开始,以 selfsuper当前模块的标识符开头。

示例:

代码语言:rust复制
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();
}
fn deliver_order() {}

mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        // 使用supper作为相对路径
        super::deliver_order();
    }

    fn cook_order() {}
}

值得注意的是:函数结构体枚举均需要加上pub关键字才能在其他模块中引用。

as 关键字

可以使用as关键字将导入的模块进行重命名。

pub use 重导出名称

可以使用pub use来导入模块,并将其重新导出,供其他模块进行调用,仿佛原本被导入的模块中函数、结构体、枚举等是在该导入模块中定义一样。

导入外部包

导入外部包需要先在 Cargo.toml 文件中声明相应的包名版本号。

将模块拆分为多个文件

可以在crate root父模块文件中仅声明模块,在相应的文件中具体的实现。

子模块需要先在父模块中进行声明,再将其文件放在与父模块同名的目录下。

。。

0 人点赞