文档列表见: Rust 移动端跨平台复杂图形渲染项目开发系列总结 (目录)
通常, C/C++ 通过 #include 导入外部符号 (不考虑 extern 和前置声明的情况).Rust 没头文件, 由 use 导入外部符号, 类似 Java 的 import, 但是 Rust 不用 Java 包名那种倒 URL 做法, 而是采用了类似 C++ 命名空间的方案, 通过 mod 声明模块来区别来自不同模块或文件的符号. 示例如下:
- #include "OpenGLES/ES2/gl.h"
- #include "Framebuffer.h"
- use namespace my_package_1::ClassHello;
- use namespace my_package_2::ClassWorld;
- use OpenGLES::ES2::gl::*;
- use Framebuffer::*;
- // Rust 通过 as 关键字解决多个模块中类型重名问题
- use mod_1::MyStruct as Mod1MyStruct;
- use mod_2::MyStruct as Mod2MyStruct;
当 C++ 包含两个同名文件时, 需要带上路径进行区分. 多个命名空间中存在同名类时, 每次使用都得用完整符号名进行区分, 即 Namespace1::Namespace2::NamespaceN::MyClass, 代码比较频繁. Rust 在处理这一问题有更好的解决方案: as 重命名避免冲突.
使用 * 导入所有符号虽然方便, 但是会消耗更多编译时间, 因此枚举当前文件使用的符号是更好的实践.
进阶: self 关键字可导入 mod.rs 文件或者与上一次目录同名的 rs 文件. 示例如下:
- // 此处 self 表示 rc.rs, 因为 rc 模块内部没切成多个目录组织源码
- use std::rc::{
- self, Rc, Weak
- };
- // 此处 self 表示 rc 目录下的 mod.rs 文件
- use std::io::{
- self, Read, Write
- };
来源: https://juejin.im/post/5beae9dae51d4550c35c7270