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按鈕,輸