鍵字速查手冊:附錄 A 關(guān)鍵字表與 r 原始標識符實戰(zhàn)(The Rust Programming Language))
教程文檔【免費下載鏈接】bookThe Rust Programming Language項目地址https://gitcode.com/gh_mirrors/bo/book點擊查看免費下載本篇技術(shù)指南以《The Rust Programming Language》TRPL官方倉庫中的「附錄 A關(guān)鍵字Keywords」為核心骨架系統(tǒng)梳理 Rust 當前使用中的全部關(guān)鍵字、為未來預留的關(guān)鍵字以及突破命名限制的原始標識符raw identifiers語法。文中所有結(jié)論均以倉庫源文檔 src/appendix-01-keywords.md及 nostarch 排版版 nostarch/appendix_a.md為基準并結(jié)合書內(nèi)各章節(jié)源碼級講解交叉印證。讀完本文你將能夠快速查證任意標識符是否可安全命名、理解每個關(guān)鍵字的職責邊界并掌握用r#前綴合法使用關(guān)鍵字尤其是跨 edition 集成遺留庫的完整實戰(zhàn)方案。附錄 A 在書中的定位與標識符概念附錄 A 位于書籍正文之后與附錄 B運算符與符號見 src/appendix-02-operators.md、附錄 Eeditions見 src/appendix-05-editions.md共同構(gòu)成全書語法的查證體系。該附錄的倉庫源文件為src/appendix-01-keywords.mdnostarch 目錄下的nostarch/appendix_a.md由其自動生成文件頭部注釋明確說明「此文件由 /src/ 目錄內(nèi)容周期性生成所有修訂需在 /src/ 中完成」——這也解釋了為什么兩份文件正文完全一致。正文開篇即給出關(guān)鍵定義Rust 語言為當前或未來使用保留了以下關(guān)鍵字。正因如此它們不能用作標識符除非使用原始標識符。標識符是函數(shù)、變量、參數(shù)、結(jié)構(gòu)體字段、模塊、crate、常量、宏、靜態(tài)值、屬性、類型、trait 或生命周期的名稱。這意味著無論是定義一個函數(shù)、一個變量、一個 struct 字段還是一個 crate 名只要與關(guān)鍵字撞名編譯器都會拒絕。理解這份清單是編寫可編譯代碼、排查命名沖突錯誤的前提。當前使用中的關(guān)鍵字共 39 個以下列表完整收錄附錄 A 中「當前使用中」的全部 39 個關(guān)鍵字依據(jù) src/appendix-01-keywords.md 逐條統(tǒng)計每項保留附錄原始功能描述并按使用場景歸類方便速查??刂屏髋c分支break立即退出循環(huán)。continue跳到循環(huán)的下一次迭代。elseif與if let控制流結(jié)構(gòu)的兜底分支。if根據(jù)條件表達式的結(jié)果分支。infor循環(huán)語法的一部分。loop無條件循環(huán)。match將值與模式進行匹配書中 ch06-02-match.md 有完整專題。return從函數(shù)返回。while基于表達式結(jié)果條件循環(huán)。for遍歷迭代器中的項、實現(xiàn) trait或指定高階生命周期higher ranked lifetime。類型、項定義與代碼組織const定義常量項或常量裸指針。enum定義枚舉。extern鏈接外部函數(shù)或變量FFI。fn定義函數(shù)或表示函數(shù)指針類型。impl實現(xiàn)固有inherent功能或 trait 功能。let綁定變量。mod定義模塊。static全局變量或持續(xù)整個程序執(zhí)行期間的生命周期。struct定義結(jié)構(gòu)體。trait定義 trait。type定義類型別名或關(guān)聯(lián)類型。union定義聯(lián)合體僅在 union 聲明中使用時才作為關(guān)鍵字即union關(guān)鍵字只有在聲明 union 時生效其他語境下并非關(guān)鍵字。作用域、路徑與可見性crate在模塊路徑中指代 crate 根。self方法主體或當前模塊。Self所定義或所實現(xiàn)類型的類型別名注意大小寫敏感Self與self是兩個不同的關(guān)鍵字。super當前模塊的父模塊。pub標記結(jié)構(gòu)體字段、impl塊或模塊中的公共可見性。use將符號引入當前作用域。as執(zhí)行基本類型轉(zhuǎn)換primitive casting、消除包含某條目的具體 trait 的歧義或在use語句中重命名條目。所有權(quán)、借用與閉包move使閉包獲得其所有捕獲的所有權(quán)。mut標記引用、裸指針或模式綁定中的可變性。ref按引用綁定。異步編程async返回一個Future而不是阻塞當前線程。await掛起執(zhí)行直到某個Future的結(jié)果就緒。布爾字面量與其余關(guān)鍵字false布爾假字面量。true布爾真字面量。dyn對 trait 對象的動態(tài)分發(fā)。unsafe標記不安全代碼、函數(shù)、trait 或?qū)崿F(xiàn)。where標記約束類型的子句。關(guān)鍵字語義深入從附錄到正文的交叉印證附錄 A 只給出每個關(guān)鍵字的一句話功能描述真正的實戰(zhàn)語義分布在書籍各章。以下選取幾組高頻關(guān)鍵字結(jié)合倉庫內(nèi)對應章節(jié)展開說明幫助你理解「為何這些詞被保留」。async 與 await異步編程的兩個支柱async與await是附錄在 2018 版Rust 2018 edition新增的關(guān)鍵字。src/ch17-01-futures-and-syntax.md 指出async fn實際上會被編譯器改寫為「返回Future的普通函數(shù)函數(shù)體是一個 async 塊」async 塊是惰性的Rust 會避免在真正需要前執(zhí)行異步代碼。await關(guān)鍵字只能出現(xiàn)在 async 函數(shù)或 async 塊內(nèi)部因為異步代碼需要運行時runtime驅(qū)動async fn page_title(url: str) - OptionString { let text trpl::get(url).await.text().await; text.html().find_first(title).map(|title| title.inner_html()) }書中還演示了async move塊的用法并明確說明main不能標記為async——異步代碼需要 runtime如 Tokio、trpl::block_on才能執(zhí)行。這正是async/await被保留、且main只能作為普通函數(shù)入口的原因。use、as 與 pub use作用域?qū)氲耐暾ぞ呦鋟se將符號引入作用域as提供重命名能力pub use則實現(xiàn)「再導出re-export」。本章節(jié)在 src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md 中有完整教學use std::collections::HashMap; // 直接導入項 use std::io::Result as IoResult; // as 別名解決同名沖突 pub use crate::front_of_house::hosting; // 再導出讓外部調(diào)用方用更短路徑要點包括use只在聲明處所在作用域內(nèi)生效換一個作用域需要重新引入引入函數(shù)時慣例是導入其父模塊而引入 struct、enum 等項時慣例是導入完整路徑同名類型沖突時可用as起別名或用std::fmt::Result/std::io::Result的父模塊路徑區(qū)分嵌套路徑use std::{io, io::Write}與 glob 運算符use std::collections::*;可精簡導入列表。這些能力共同決定了use、as、self、pub等關(guān)鍵字在路徑體系中的不可替代地位。self / Self / super / crate模塊路徑四件套self表示當前模塊可用于use self::module::Item顯式區(qū)分路徑起點Self是「正在定義或?qū)崿F(xiàn)的類型」的類型別名在impl塊與 trait 方法返回值中大量出現(xiàn)如fn new() - Selfsuper指向父模塊用于相對路徑上行crate指向 crate 根構(gòu)成絕對路徑的起點如crate::front_of_house::hosting。dyn、move、mut、ref與語言核心機制綁定的保留詞dyn用于 trait 對象實現(xiàn)動態(tài)分發(fā)見 src/ch18-02-trait-objects.md。Boxdyn Draw這類寫法讓一組實現(xiàn)了同一 trait 的不同類型可以被統(tǒng)一引用。move讓閉包強制獲得捕獲變量的所有權(quán)見 src/ch13-01-closures.md常用于將數(shù)據(jù)移入新線程等需要所有權(quán)轉(zhuǎn)移的場景。mut貫穿引用與模式綁定是可變性的唯一入口ref在模式中按引用綁定與在表達式中的借用相對應模式語法詳解見 src/ch19-03-pattern-syntax.md。unsafe是 Rust 中「不保證安全」的顯式開關(guān)見 src/ch20-01-unsafe-rust.md用于解引用裸指針、調(diào)用外部函數(shù)、訪問可變靜態(tài)量、實現(xiàn)不安全 trait 等場景。為未來保留的關(guān)鍵字14 個以下關(guān)鍵字目前沒有任何功能但被 Rust 預留用于未來可能的使用。把它們當作不可用的標識符即可abstractbecomeboxdofinalgenmacrooverrideprivtrytypeofunsizedvirtualyield值得注意的是這份「保留」清單是動態(tài)的其中try已在 2018 edition 中從「保留」轉(zhuǎn)為「當前使用」gen則在較新版本中開始承載生成器相關(guān)語義。附錄 A 強調(diào)這些詞「尚不具備任何功能」因此即便當前編譯器允許在某些位置使用如box曾作為老式指針語法也不應依賴其未定義的行為。如需完整清單可直接核對倉庫中的 src/appendix-01-keywords.md。原始標識符Raw Identifiers用 r# 合法使用關(guān)鍵字原始標識符是允許你在正常情況下不允許使用關(guān)鍵字的位置使用關(guān)鍵字的語法只需在關(guān)鍵字前加上r#前綴即可。例如match是關(guān)鍵字。如果試圖編譯下面這個以match命名的函數(shù)源碼對應倉庫中的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錯誤信息表明你不能把關(guān)鍵字match用作函數(shù)標識符。要將match用作函數(shù)名需要使用原始標識符語法fn r#match(needle: str, haystack: str) - bool { haystack.contains(needle) } fn main() { assert!(r#match(foo, foobar)); }這段代碼可以無錯編譯。注意r#前綴同時出現(xiàn)在函數(shù)定義處和main中調(diào)用處。原始標識符的三大實際用途自由命名原始標識符允許你使用任何你選擇的詞作為標識符即使該詞恰巧是保留關(guān)鍵字。這給了你更多選擇標識符名的自由度??缯Z言集成當你的 Rust 程序需要與某種「不把這些詞當關(guān)鍵字」的語言編寫的程序集成時例如通過 FFI 調(diào)用外部符號r#讓這些符號可以直接在 Rust 側(cè)引用。跨 edition 使用庫原始標識符還允許你使用以與你 crate 不同的 Rust edition 編寫的庫。跨 edition 集成r#try 實戰(zhàn)場景第三點對應附錄 E 的說明。以try為例try在 2015 edition 中不是關(guān)鍵字但在 2018、2021 和 2024 edition 中都是關(guān)鍵字src/appendix-05-editions.md 明確記載當前有 2015、2018、2021、2024 四種 edition本書正文按 2024 edition 編寫。假設(shè)你依賴一個用 2015 edition 編寫、并導出了名為try的函數(shù)的庫你的項目運行在 2018 或更高 editiontry已是關(guān)鍵字直接寫try(...)無法編譯解決辦法是使用原始標識符語法r#try來調(diào)用該函數(shù)。edition 機制保證了「同一份代碼在不同 edition 下解析方式不同」而r#正是跨過這條解析邊界的通行證。附錄 E 還指出edition 切換只影響編譯器最初解析代碼的方式因此「2015 項目依賴 2018 庫」與「2018 項目依賴 2015 庫」都可以正常編譯鏈接新關(guān)鍵字的引入正是 edition 可能帶來不兼容變更的典型例子。如何在本倉庫中查閱與驗證附錄 A 源文檔src/appendix-01-keywords.md含原始標識符完整示例與錯誤輸出nostarch 排版版見 nostarch/appendix_a.md兩者內(nèi)容一致。附錄 B運算符與符號src/appendix-02-operators.md覆蓋::、-、等與關(guān)鍵字互補的符號語法。附錄 Eeditionssrc/appendix-05-editions.md解釋 edition 與關(guān)鍵字演進的關(guān)聯(lián)、Cargo.toml中edition鍵的默認值缺省為 2015及cargo fix自動升級工具。正文交叉章節(jié)use/as/pub usesrc/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md、async/awaitsrc/ch17-01-futures-and-syntax.md、dyntrait 對象src/ch18-02-trait-objects.md、模式中的mut/refsrc/ch19-03-pattern-syntax.md、unsafesrc/ch20-01-unsafe-rust.md。建議把本文或附錄 A 源文件作為日常開發(fā)的關(guān)鍵字速查表遇到expected identifier, found keyword編譯錯誤時先核對目標詞是否在本附錄清單中若是改用r#前綴或按附錄 E 的方法評估是否需要切換 edition。這樣既能寫出符合 edition 規(guī)范的現(xiàn)代 Rust 代碼也能平滑兼容歷史庫與外部符號。贊分享教程文檔【免費下載鏈接】bookThe Rust Programming Language項目地址https://gitcode.com/gh_mirrors/bo/book點擊查看免費下載相關(guān)推薦5 輪對話把模糊念頭逼成可執(zhí)行決策grill-me 無狀態(tài)訪談協(xié)議全解5 輪對話把模糊念頭逼成可執(zhí)行決策grill me 無狀態(tài)訪談協(xié)議全解 腦子里有個念頭轉(zhuǎn)了兩天說不清楚方向像是對的但每想推進一步就撞上一個沒答案的細節(jié)。教程文檔《The Rust Programming Language》附錄 D 精講rustfmt、cargo fix、Clippy 與 rust-analyzer 開發(fā)工具鏈實戰(zhàn)《The Rust Programming Language》附錄 D 精講rustfmt、cargo fix、Clippy 與 rust analyzer教程文檔Rust 關(guān)鍵字速查手冊C 開發(fā)者視角下的核心語法對照與實戰(zhàn)要義Rust 關(guān)鍵字速查手冊C 開發(fā)者視角下的核心語法對照與實戰(zhàn)要義 本文是 Rust for C Programmers https://link.gitcod文檔教程上一篇從裸機到能開機OpCore-Simplify 的 OpenCore EFI 自動配置路徑下一篇深入解析 ESLint 文檔站的 Rule 宏組件從參數(shù)模型到渲染實現(xiàn)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考