Rust 提供了代碼封裝的機制。可以通過crate (等同於Java中的package)建立相對獨立的module模組,模組中封裝了可以重複使用的功能函數。
當建立了自己的 lib 庫或者要使用第三方的庫的時候(這些庫就是一些事先寫好的crate)需要將這些庫中的module 模組引用到當前的環境中。
Rust提供了以下幾種引用方式: 一、使用 extern crate
在使用這些Module的檔案中,通過 extern crate + crate名稱將包內的模組引入當前環境。
extern crate my_library;fn main() { println!("Hello in English: {}", my_library::english::greetings::hello()); println!("Goodbye in English: {}", my_library::english::farewells::goodbye()); println!("Hello in Chinese: {}", my_library::chinese::greetings::hello()); println!("Goodbye in Chinese: {}", my_library::chinese::farewells::goodbye());}
通過 extern crate 引入的 crate 或者類庫,需要通過兩個 :: 雙引號逐層將需要引用的module模組,直到調用的功能函數為止,比如:
my_library::english::farewells::goodbye()
這裡說一下上面這一行都是什麼。什麼關係。
二、crate、module和功能方法的關係
my_library::english::farewells::goodbye()
my_library 是我們使用 cargo new 建立的項目名稱,也就是項目預設的module的名字,這個module是 root module,module對應的檔案是 lib.rs 。
所以,當我們在 lib.rs 中聲明 pub mod english; 的時候,就產生了這樣的關係 my_library::english;
然後在 src/english.rs 或者 src/english/mod.rs 中聲明 pub mod farewells;時,就有這樣的關係my_library::english::farewells
最後,到達聲明的方法為止。
my_library::english::farewells::goodbye()
這也叫做從root module (根模組) my_library 到功能函數 goodbye的絕對路徑。 三、使用 use
在使用 extern 引入包之後,可以用 use 將模組引入到當前範圍。
extern crate my_library;use my_library::english::greetings::hello;use my_library::english::farewells::goodbye;fn main() { println!("Hello in English: {}", hello()); println!("Goodbye in English: {}", goodbye());}
這樣,就可以像使用本地功能函數一樣使用模組中的功能函數了。
引入同一個模組中的功能函數,這麼多模組重複寫,太不方便了。
use my_library::english::greetings::hello;use my_library::english::farewells::goodbye;
可以用{}簡寫這樣:
use my_library::english::{greetings, farewells}; 四、使用 pub use
在 src/english/mod.rs中,定義了兩個模組 greetings 和 farewells 。
pub mod greetings;pub mod farewells;
通過 use 可以使用上面的絕對路徑引用功能函數。
my_library::english::greetings::hello()
修改如下:
pub use self::greetings::hello;pub use self::farewells::goodbye;mod greetings;mod farewells;
pub use 將後面的跟隨的模組中的功能函數引入當前範圍。
使用的時候,
extern crate my_library;use my_library::english::hello;use my_library::english::goodbye;fn main() { println!("Hello in English: {}", hello()); println!("Goodbye in English: {}", goodbye());}
還可以用 * ,把greetings的所有內容引入當前模組範圍。
pub use self::greetings::*;mod greetings;mod farewells;
self 是什麼。 self 指的是當前模組,這裡的self指的是 english 模組。除了 self ,還有 super 指向當前模組的上級模組。
self 和 super 都是相對路徑。 五、使用 as
extern crate my_library as sayings;use sayings::chinese::greetings as ch_greetings;use sayings::chinese::farewells::*;use sayings::english::{self, greetings as en_greetings, farewells as en_farewells};fn main() { println!("Hello in English; {}", en_greetings::hello()); println!("And in Chinese: {}", ch_greetings::hello()); println!("Goodbye in English: {}", english::farewells::goodbye()); println!("Again: {}", en_farewells::goodbye()); println!("And in Chinese: {}", goodbye());}
上面的代碼除了第四句,其他的都好理解。
第四句等同於:
use sayings::english;use sayings::english::greetings as en_greetings;use sayings::english::farewells as en_farewells;