1、建立如下rust工程
不用管其中程式碼的作用是什麼,只要知道有一個main.rs和四個模組s1、s2、s3、s4即可。
2、s1模組使用了Rust2015的模組格式,即:需要建立s1資料夾,在s1下建立功能檔案hello.rs及名為mod.rs的模組定義檔案。
s1/hello.rs
pub fn say_hello(){
println!("hello from module s1");
}
s1/bye.rs
pub fn say_bye(){
println!("good bye from module s1");
}
s1/mod.rs
//省略無關部分
。。。。。。
pub fn main1() {
// 獲取單例例項
let instance1 = Singleton::get_instance();
let instance2 = Singleton::get_instance();
// 修改單例資料
{
let mut instance = instance1.lock().unwrap();
instance.data = String::from("s1:Modified singleton instance");
}
// 輸出單例資料
{
let instance = instance2.lock().unwrap();
println!("{}", instance.data);
}
hello::say_hello();
}
mod hello;
mod bye;
注意mod語句可以出現在mod.rs檔案的任何位置,可以加pub以示公開,可以宣告多個mod,不使用mod語句宣告的模組不參與編譯。
3、s2模組使用了Rust2018的模組格式,即:s2資料夾下建立功能檔案hello.rs等,同時建立一個與s2資料夾同級的檔案s2.rs
s2/hello.rs
pub fn say_hello(){
println!("hello from module s2");
}
s2.rs
mod hello;
pub fn main2() {
hello::say_hello();
}
4、s3和s4使用了單檔案模組,比較簡單,不再贅述。
s3.rs
//省略無關程式碼
。。。
pub fn main3() {
// 獲取單例例項
let instance = INSTANCE.borrow();
println!("{}", instance.data);
}
5、最後,在工程的main.rs或lib.rs等程式入口檔案,需要宣告s1、s2、s3、s4等頂級模組:
main.rs
mod s1;
mod s2;
fn main() {
s1::main1();
s2::main2();
s3::main3();
s4::main4();
}
mod s3;
mod s4;
注意mod語句的位置、順序都是無關緊要的。
6、總結:
mod是建立大工程的管理基礎,搞清楚其語法規則對於初學者很重要。另外,本文只討論了將檔案作為mod時的mod語句規則,沒有討論內嵌mod的語法,請自行查資料學習。本文也沒有討論use語句,對於rust而言,use更像是一個對模組路徑重新命名的“語法糖”,請參考其他資料。
本練習的原始檔附後供參考:
本次練習的源程式