文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)git
一般,C/C++经过#include
导入外部符号(不考虑extern
和前置声明的状况)。Rust没头文件,由use
导入外部符号,相似Java的import
,可是Rust不用Java包名那种倒URL作法,而是采用了相似C++命名空间的方案,经过mod
声明模块用以区分来自不一样模块或文件的符号。示例以下:github
#include "OpenGLES/ES2/gl.h"
#include "Framebuffer.h"
use namespace my_package_1::ClassHello;
use namespace my_package_2::ClassWorld;
复制代码
Rust经过as关键字解决多个模块中符号重名问题。数据结构
use OpenGLES::ES2::gl::*;
use Framebuffer::*;
use mod_1::MyStruct as Mod1MyStruct;
use mod_2::MyStruct as Mod2MyStruct;
复制代码
当C++包含两个同名文件时,须要带上路径进行区分。多个命名空间中存在同名类时,每次使用都得用完整符号名进行区分,即Namespace1::Namespace2::NamespaceN::MyClass,代码比较频繁。 Rust在处理这一问题有更好的解决方案:as
重命名避免冲突。可是,经过我实践发现,使用完整模块路径及类型名更直观,相似C++的作法。app
使用*
导入全部符号虽然方便,可是会消耗更多编译时间,所以枚举当前文件使用的符号是更好的实践。post
进阶:self
关键字可导入mod.rs文件或者与上层目录同名的rs文件。 示例以下:spa
// 此处self表示rc.rs,由于rc模块内部没切成多个目录组织源码
use std::rc::{self, Rc, Weak};
// 此处self表示rc目录下的mod.rs文件
use std::io::{self, Read, Write};
复制代码
导入多个二级模块及某一模块数据结构的示例:code
use hal::{
buffer, format as f, window::Extent2D,
};
复制代码
导入多级模块及模块内数据结构的示例:orm
// https://github.com/amethyst/amethyst/blob/v0.9.0/examples/fly_camera/main.rs
use amethyst::{
assets::{PrefabLoader, PrefabLoaderSystem, RonFormat},
controls::FlyControlBundle,
core::transform::TransformBundle,
input::InputBundle,
prelude::*,
renderer::{DrawShaded, PosNormTex},
utils::{application_root_dir, scene::BasicScenePrefab},
Error,
};
复制代码