1. 程式人生 > >Rust 使用外部功能函式的幾種方式

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

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;

相關推薦

C#中關於增強類功能方式

存儲 add eof .html using com 靜態方法 ant tel C#中關於增強類功能的幾種方式 本文主要講解如何利用C#語言自身的特性來對一個類的功能進行豐富與增強,便於拓展現有項目的一些功能。 拓展方法 擴展方法被定義為靜態方法,通過實例方法語法進行調用。

Spark 讀取外部檔案的方式

textFile函式 /** * Read a text file from HDFS, a local file system (available on all nodes), or any * Hadoop-supported f

實現定時器功能方式

nsrunLoop GCD RAC NsrunLoop NSRunLoop是IOS訊息機制的處理模式 一條執行緒對應一個RunLoop,主執行緒的RunLoop預設已經建立好了, 而子執行緒的需要我們自己手動

Rust 使用外部功能函式方式

Rust 提供了程式碼封裝的機制。可以通過crate (等同於Java中的package)建立相對獨立的module模組,模組中封裝了可以重複使用的功能函式。 當建立了自己的 lib 庫或者要使用第三方的庫的時候(這些庫就是一些事先寫好的crate)需要將這些

maven 引入外部jar包的方式

dep repo 執行 install tor 顯式 pat comment osi 方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud</groupId

JS建立函式方式

js中建立函式的三種方式: 第一種(函式宣告):  function sum1(num1,num2){    return num1+num2; } sum1(10,20); 第二種(函式表示式): var sum2 = function(num1,num2

關於Vue下元件引入第三方外部Js方式

第一種方式:利用Vue的mounted生命週期 const oScript = document.createElement('script'); oScript.type = 'text/javascript'; oScript.src = '//g.alicdn.com/sd/smartCap

scala定義函式方式

    scala是面向物件的語言,同時也是函數語言程式設計語言。函式在scala中是一等公民,它和變數一樣,既可以作為其他函式的引數,也可以將函式賦值給一個變數。    在scala中定義函式有很多方式,不熟悉scala的同學初看之時難免被搞得暈頭轉向。這裡,我試圖按照函式

簡要描述 JavaScript 中定義函式方式

JavaScript 中,有三種定義函式的方式: 1、函式語句:即使用 function 關鍵字顯式定義函式。如: function f(x){ return x+1; } 2、函式定義表示式

js裡宣告函式方式? var abc = function(x){} 和 function abc(x){} 這兩宣告方法有什麼不同?

先後者是指函式宣告,前者是指函式表示式,他們之間的區別是後者會在程式碼執行之前被JS直譯器載入到作用域中,這樣一來就可以在程式設計時在定義函式之前呼叫這個函式,此法是有效的;而前者則是在程式碼執行到那一行時候才會有定義,此外函式表示式是建立了一個匿名函式,然後將

外部獲取IndexPath的方式(關聯物件等)

1、 一般方式 - (void)buttonAction:(UIButton *)sender { UITableViewCell *cell = (UITableViewCell *)[[sender superview] superview]; NSIndexPath *indexPath = [_t

java中實現swap函式方式

java中實現swap解決方案 由於java中“對基本型別的變數是不支援引用傳遞的”,所以根本不能像c/c++那樣直接傳地址,但是可以如下解決: 1.使用陣列傳值 public class T

列印功能實現方式 [print]

HTML: <iframe frameborder="0" id="printIframebBtn" name="printIframe" style="width:0;height:0;"></iframe> 最終版本: $.

lambda函式是變成對集合進行排序的方式

先來一個集合: List<Point> points = Arrays.asList( new Point(1, 2), new Point(3, 2),

函式宣告的方式函式宣告與函式表示式的區別,函式呼叫的方式

函式宣告的幾種方式 三種 : 函式宣告(1),函式表示式(2~5),Function構造器(6) 1.function func1(a){}//函式宣告 2.var func2=function(b){}//函式表示式 3.var func3=function func4(

記住我remember-me功能實現方式

        本文討論幾種記住我功能的實現方式。         原理:使用者登入後,服務端為使用者生成一個Token,並放入客戶端Cookie中。下次使用者登入,服務端驗證Cookie中的Token並自動登入。 簡單的Token生成方法            Tok

關於在外部拿到RecyclerView的viewholder的方式

      在實際開發中,我們常常碰到這樣的需求,需要在外部拿到RecyclerView 中的viewHoler,從而動態的修改UI,在RecyclerView中,我們需要自己封裝點選事件,一般的做法是在recyclerview每一次bind的時候我們給viewholder

建構函式方式

工廠模式 使用工廠模式建構函式,系統會在函式內部自動幫你定義一個物件,如: var obj = new Object(); 函式構建完成後系統還會自動幫你返回一個物件,如: return this; 工廠模式分為三個步驟建構函式: 1.原料:原料

拿JS非同步函式返回值的方式

在我們的編碼過程中,為了滿足業務需求,經常需要獲取JS非同步函式的返回值。今天就來彙總一下拿值的幾種方式。 1,通過回撥函式的方式來拿返回值,這個想必大家不會陌生 function getSomething(cb) { var r = 0;

Eclipse安裝svn插件的方式 轉帖....

如果 version name feature help sin 鏈接 exe 文件 Eclipse安裝svn插件的幾種方式 1.在線安裝: (1).點擊 Help --> Install New Software... (2).在彈出的窗口中點擊add按鈕,輸