C++與Rust引用外部符號的比較

熊皮皮發表於2018-11-13

文件列表見: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;
複製程式碼

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++的做法。

使用*匯入所有符號雖然方便,但是會消耗更多編譯時間,因此列舉當前檔案使用的符號是更好的實踐。

進階:self關鍵字可匯入mod.rs檔案或者與上層目錄同名的rs檔案。 示例如下:

// 此處self表示rc.rs,因為rc模組內部沒切成多個目錄組織原始碼use std::rc::{self, Rc, Weak
};
// 此處self表示rc目錄下的mod.rs檔案use std::io::{self, Read, Write
};
複製程式碼

匯入多個二級模組及某一模組資料結構的示例:

use hal::{ 
buffer, format as f, window::Extent2D,
};
複製程式碼

匯入多級模組及模組內資料結構的示例:

// https://github.com/amethyst/amethyst/blob/v0.9.0/examples/fly_camera/main.rsuse amethyst::{ 
assets::{PrefabLoader, PrefabLoaderSystem, RonFormat
}, controls::FlyControlBundle, core::transform::TransformBundle, input::InputBundle, prelude::*, renderer::{DrawShaded, PosNormTex
}, utils::{application_root_dir, scene::BasicScenePrefab
}, Error,
};
複製程式碼

來源:https://juejin.im/post/5beae9dae51d4550c35c7270

相關文章