附錄 A:關鍵字
以下列表包含 Rust 目前或未來會使用到而保留起來的關鍵字。這意味著它們不能作為標識符使用(不過等等會提到的「原始標識符」除外),標識符包含函式、變數、參數、結構體欄位、模組、crates、常數、巨集、靜態數值、屬性、型別、特徵與生命週期的名稱。
目前有在使用的關鍵字
以下為目前的關鍵字列表與其對應的功能描述。
as
- 進行原始型別轉換、消除包含項目的特定特徵之歧異,或重新命名use
陳述式內的項目async
- 回傳Future
而非阻擋目前執行緒await
- 暫停執行直到Future
的結果已經準備好break
- 立即離開迴圈const
- 定義常數項目或常數裸指標continue
- 繼續進入下一次迴圈疊代crate
- 在模組路徑中,指的是 crate 的源頭dyn
- 對特徵物件的動態配置else
-if
與if let
控制流結構的例外選項enum
- 定義列舉extern
- 連結外部函式或變數false
- 布林字面值 falsefn
- 定義函式或函式指標型別for
- 從疊代器遍歷項目、實作特徵,或指定高階生命週期(higher-ranked lifetime)if
- 依據條件表達式的分支impl
- 實作本身或特徵的功能in
-for
迴圈語法的其中一部分let
- 綁定變數loop
- 無條件的迴圈match
- 將數值配對到模式mod
- 定義模組move
- 讓閉包取得其所有捕獲的所有權mut
- 表示參考、裸指標或模式綁定具有可變性pub
- 表示結構欄位、impl
區塊或模組對外公開ref
- 綁定參考return
- 函式的回傳Self
- 我們正在定義或實作型別的型別別名self
- 方法本體或當前模組static
- 全域變數或存在於整個程式執行期間的生命週期struct
- 定義結構體super
- 當前模組的上層模組trait
- 定義特徵true
- 布林字面值 truetype
- 定義型別別名或關聯型別union
- 定義聯集 union; 只作為宣告聯集時的關鍵字unsafe
- 表示不安全的程式碼、函式、特徵或實作use
- 將符號引入作用域where
- 表示約束該型別用的子句while
- 依據表達式結果的條件迴圈
未來可能會使用而保留的關鍵字
以下關鍵字沒有任何功能但是 Rust 可能會在未來使用到所以作為保留:
abstract
become
box
do
final
macro
override
priv
try
typeof
unsized
virtual
yield
原始標識符
*原始標識(Raw identifiers)*是個能讓你使用正常情況下不允許使用的關鍵字的語法。你能夠過加上 r#
關鍵字前綴來使用原始標識符。
舉例來說,match
是個關鍵字。如果你嘗試編譯以下使用 match
作為名稱的函式的話:
檔案名稱:src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
你會獲得此錯誤:
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
錯誤表示你不能使用關鍵字 match
作為函式標識符。要使用 match
作為函式名稱的話,你可以使用原始標識符語法,如以下所示:
檔案名稱:src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle) } fn main() { assert!(r#match("foo", "foobar")); }
此程式碼就能夠編譯並沒有任何錯誤。注意到 r#
前綴會用於函式定義的名稱以及在 main
呼叫該函式的地方。
原始標識符能讓你使用任何字作為標識符,就算該字剛好是保留的關鍵字。這給了我們更多選擇標識符名稱的自由,以及讓我們與以這些單詞不是關鍵詞的語言編寫的程式進行整合。除此之外,原始標識符讓你可以使用與你 crate 的 Rust 版號(edition)不相同的函式庫。舉例來說 try
在 2015 版號還不是關鍵字,但到 2018 版號才加入。如果你依賴一個使用 2015 版號的函式庫,且其中有個 try
函式,你就需要使用原始標識符語法。在此例中就是在你 2018 版號的程式碼用 r#try
來呼叫該函式。請查閱附錄 E以瞭解關於版號的更多資訊。