2016-04-03 71 views
15

在談到進口時,生鏽的人經常使用前奏什麼是前奏?

這是什麼前奏他們在談論什麼?

它如何影響我的Rust程序?

回答

13

生鏽,爲了使用一個符號,你必須:

  • 已在當前範圍內定義的符號
  • 已經通過use指令進口在當前範圍內的符號:use std::mem;
  • std::mem::replace

不過,有些極少數符號可沒有這樣的動作來使用:

  • 使用其絕對路徑指符號:例如OptionCopy

    這是由於Rust prelude

    許多特徵,類型和功能被認爲是如此頻繁地使用,因此它不需要它們的使用需要明確地每次輸入必要的符號。這得以實現歸功於由編譯器拍攝的兩個隱式操作:

    • 在每個板條箱的根,編譯器噴射的每個模塊中的隱式extern crate std;
    • ,編譯器噴射的隱式use std::prelude::v1::*;(現在)

    std::prelude::v1只是一個常規模塊,它使用pub use ...語法重新導出那些常用符號。它的確切內容可以在here找到。


    其他一些庫或標準庫的連子組件還定義了prelude模塊,你可以用相同的水珠導入語法導入:use xxx::prelude::*;。與std::prelude不同,但是這些並不是編譯器特有的,因此需要顯式導入。


    編譯器是不可知的前奏的確切內容,因此,如果一個是用自己更換std箱(例如,在嵌入式開發),一會又決定什麼進入他們的std::prelude::v1模塊。

  • +0

    @LukasKalbertodt:好的,我已經開始用'vec!','panic!'......來寫答案了,但是找不到它們來自哪裏。我會刪除它。 –

    +0

    [此RFC](https://github.com/rust-lang/rfcs/pull/890)建議將前奏功能添加到用戶箱。它已經關閉了一段時間,但可能會在未來恢復。 –

    +0

    @MatthieuM。感謝您的明確解釋。看起來'println!'宏不是來自'std :: prelude'? –