Rust模块的使用
2024-03-17 17:33:41
模块定义
模块分为两种形式存在
内联模块
内敛模块就是写在源文件内部
1 | mod mod1 { |
虽然是在同一个文件,但也要求函数用pub
关键字公开才能访问。
文件模块
默认情况下,文件模块以两种形式存在
module_name.rs
此时文件名就是模块名。module_name/mod.rs
此时文件夹名就是模块名。
如果同时存在同名文件和文件夹会如何呢?这会产生歧义,编译器会发出错误
1 | error[E0761]: file for module `mod2` found at both "src\mod2.rs" and "src\mod2\mod.rs" |
并要求删除其中一个
1 | help: delete or rename one of them to remove the ambiguity |
用文件夹的方式是为了用嵌套模块,子模块文件应该在文件夹下,比如parent/child.rs
,然后在mod.rs
文件中导出子模块
1 | pub mod child; |
不过需要注意,这个mod.rs
的约定从 Rust 2018 开始就不推荐了,因为当模块过多时将会有很多同名文件。
包含子模块的模块
从 Rust 2018 起,就不要再用mod.rs
那样的方式组织子模块了,推荐方式是这样
1 | main.rs |
这样就有3个层级
1 | mod foo; |
模块引用方式
默认方式
用mod module_name
引用即可
1 | mod mod2; |
path属性定位模块文件
假设有一个模块文件在src/a/b/c.rs
文件中,那么使用时可以通过path
属性定位,并且模块名可以自定义
1 |
|
include宏包含模块
1 | mod mod3 { |
这样也可以自定义模块名。主要的区别是include!
会把代码文件插入进来,这可以用于将大量的代码拆分到多个文件中,使代码更加清晰和易于维护。
但这样做的缺点是对IDE提示不友好,无法得知模块内提供了什么内容。
模块访问权限
默认情况下,模块内所有数据都是私有的,需要通过pub
关键字公开
1 | // 将子模块公开 |