Rust学习日记0x03
模块和包 Crate Crate是Rust编译的最小代码单位,即使是使用rustc而非Cargo,也会将那个文件认作是一个crate。 Crate的两种形式:二进制项和库,前者提供main函数定义被执行时的操作,后者没有main函数,也不会被编译为可执行文件。 Package 包提供一个或多个crate,通过cargo.toml文件描述如何构建crates,至多含有一个library crate,至少含有一个crate Cargo创建包之后,会将src/main.rs当作与包同名的二进制crate根文件,如果存在src/lib.rs会当作是与包同名的库crate根文件,多个二进制crate可以放在src/bin目录下。 crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。 模块作用域 Crate根文件作为Crate的编译入口,可以在其中使用mod modename关键字声明模块,编译器会依次从: 内联 “src/modname.rs” “src/modname/mod.rs” 中寻找模块代码。 同理也可以声明子模块,使用mod submodname,编译器会依次从: 内联 “src/modname/submodname.rs” “src/modname/submodname/mod.rs” 中寻找子模块代码。 use关键字,可以通过指向代码路径,创建该方法的快捷方式, Paths 在Rust中,指向模块的路径使用::分隔 绝对路径:以Crate根开头的路径,对于模块内代码使用crate字面量 相对路径:从当前模块开始,使用self、super或当前模块标识符开头 私有性 在使用模块时,需要注意模块的私有性,在Rust中,子模块的所有项目都是私有的,需要使用pub关键字暴露其路径使其变为公有。 即使模块是公有的,其内部内容仍然是私有的,需要显式声明pub 结构体 即使结构体是公有的,其字段仍然可以是私有的。且当结构体具有私有字段时,需要设计关联函数。否则无法在其他的模块中创建该结构体,因为无法设置私有字段的值。 枚举 与结构体不同,如果枚举是公有的,其枚举成员都是公有的。 Use关键字 使用use关键字,可以在其所在作用域里创建一个指向路径的快捷方式,使其成为在当前作用域的合法名称。 通常在使用use关键字时,约定俗成的习惯是 创建函数的父模块路径 结构体、枚举完整路径 其他完整路径 pub use重导入 利用pub use不仅可以将路径导入到当前作用域,还可以允许他人将路径导入到其作用域中。 外部包 导入外部包时,需要使用use将其引入项目包的作用域,即使是标准库对于项目包来说也是外部包,因此使用时需要导入,如下: use std::collections::HashMap; 嵌套路径 为了避免多次使用use语句,可以使用嵌套路径进行表达,形如: use std::{cmp::Ordering, io}; use std::io::{self, Write}; 也可以使用glob运算符,例如*一次性导入某路径下所有公有项。