rust為什麼顯示不了國服_Rust 學習筆記-15 模組化
技術標籤:rust為什麼顯示不了國服
邏輯程式碼組成為模組。
多個模組被編譯成一個稱為 crate 的單元。
概念
- crate
- Cargo
- module
- crates.io
crate:
- Rust程式可能包含一個二進位制 crate 或一個庫 crate 。
- 二進位制 crate 是一個具有 main()方法的可執行檔案。
- 庫 crate 是一組可以在其他專案中重用的元件。與二進位制 crate 不同,庫crate 沒有入口點(main() 方法)。
cargo:
- Cargo工具是用來管理Rust 的crates 。
module:
- 在一個crate中對程式碼進行邏輯分組
- 例如,網路模組包含網路相關功能,圖形模組包含與繪圖相關的功能。模組類似於其他程式語言中的名稱空間。
crates.io:
- 官方Rust 包(crate)倉庫.
- 第三方crates可從crates.io 下載獲取。
模組語法:
// 公開的模組pub mod a_public_module { pub fn a_public_function() { // 公開的方法. } fn a_private_function() { // 私有方法. }}//私有模組mod a_private_module { fn a_private_function() { }}
模組可以是公有的或私有的。其他模組無法訪問私有模組中的元件。Rust中的模組預設是私有的。相反,公有模組中的函式可以被其他模組訪問。模組應該以 pub關鍵字作為字首使其變成公有的。公有模組中的函式也必須公開。
定義一個模組
該示例定義了一個公共模組−movies。該模組包含一個函式play(),該函式接受引數並列印其值.
pub mod movies { pub fn play(name:String) { println!("Playing movie {}",name); }}fn main(){ movies::play("天龍八部".to_string());}
輸出結果:
Playing movie 天龍八部
Use 關鍵詞
use關鍵字用來匯入公共模組。
語法:
use public_module_name::function_name;
例如:
pub mod movies { pub fn play(name:String) { println!("Playing movie {}",name); }}use movies::play;fn main(){ play("天龍八部 ".to_string());}
輸出:
Playing movie 天龍八部
巢狀模組
模組也可以巢狀。comedy 模組巢狀在 english 模組中,後者進一步巢狀在 movies模組中。
下面給出的示例定義了movies/english/comedy模組中的函式播放
pub mod movies { pub mod english { pub mod comedy { pub fn play(name:String) { println!("Playing comedy movie {}",name); } } }}use movies::english::comedy::play; // 匯入一個公共模組.fn main() { // short path syntax play("天龍八部".to_string()); play("戰狼".to_string()); //full path syntax movies::english::comedy::play("飛上雲霄".to_string());}
輸出結果:
Playing comedy movie 天龍八部Playing comedy movie 戰狼Playing comedy movie 飛上雲霄
建立一個庫crate 並在二進位制crate 中使用
讓我們建立一個名為movie_lib的庫,其中包含一個movies模組.
第一步: 建立應用.
建立目錄movie-app
D:demoustmovie-app>cargo new movie-lib --lib Created library `movie-lib` packageD:demoustmovie-app>
目錄結構是這樣的.
movie-app movie-lib/ -->Cargo.toml -->src/ lib.rs movies.rs
第二步: 編輯Cargo.toml 編輯專案元資料.
[package]name = "movie-lib"version = "0.1.0"authors = ["aron9g "]edition = "2018"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
第三步: 編輯 lib.rs 檔案.
新增以下行到檔案lib.rs
pub mod movies;
以上指令建立了一個公共模組: movies
第四步: 編輯movies.rs 檔案
pub fn play(name:String){ println!("Playing movie {} :movies-app",name);}
上面的程式碼定義了一個函式play(),它接受一個引數並將其列印到控制檯
第五步: 構建庫 crate.
使用cargo build命令構建應用程式,以驗證庫crate的結構是否正確。確保您位於專案的根目錄-電影應用程式資料夾。如果構建成功,終端將顯示以下訊息:
D:demoustmovie-appmovie-lib>cargo build Compiling movie-lib v0.1.0 (D:demoustmovie-appmovie-lib) Finished dev [unoptimized + debuginfo] target(s) in 0.26s
第六步: 建立一個測試程式
在movie app資料夾後建立另一個資料夾movie-lib-test , Cargo.toml檔案和src資料夾。這個專案應該有main方法,因為這是一個二進位制crate,
D:demoustmovie-app>cargo new movie-lib-test --bin Created binary (application) `movie-lib-test` package
資料夾結構如圖所示:
movie-app movie-lib // already completed movie-lib-test/ -->Cargo.toml -->src/ main.rs
第七步: 新增依賴. 編輯Cargo.toml
在movie-lib-test 專案的cargo.toml檔案下.
[package]name = "movie-lib-test"version = "0.1.0"authors = ["aron9g "]edition = "2018"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]movie_lib = { path = "../movie-lib" }
庫資料夾的路徑設定為依賴項。下圖顯示了這兩個專案的內容
第八步: 編輯main.rs
extern crate movie_lib;use movie_lib::movies::play;fn main() { println!("inside main of test "); play("星球大戰".to_string())}
第九步: 構建並執行:
cargo run
輸出結果:
D:demoustmovie-appmovie-lib-test>cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.01s Running `targetdebugmovie-lib-test.exe`inside main of testPlaying movie 星球大戰 :movies-app
往期回顧:
今天不知怎麼發不了往期文章連結,檢視往期,點我頭像.