Rust 使用外部功能函數的幾種方式_rust

來源:互聯網
上載者:User

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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.