Rust 官網:https://www.rust-lang.org/zh-CN/
1、Rust?簡介
Rust?是一門注重安全(safety)、速度(speed)和并發(concurrency)的現代系統編程語言。Rust 通過內存安全來實現以上目標,但不使用垃圾回收機制(garbage collection, GC)。
Rust?特點
- 高性能:Rust 速度驚人且內存利用率極高。由于沒有運行時和垃圾回收,它能夠勝任對性能要求特別高的服務,可以在嵌入式設備上運行,還能輕松和其他語言集成。
- 可靠性:Rust 豐富的類型系統和所有權模型保證了內存安全和線程安全,讓您在編譯期就能夠消除各種各樣的錯誤。
- 生產力:Rust 擁有出色的文檔、友好的編譯器和清晰的錯誤提示信息, 還集成了一流的工具——包管理器和構建工具, 智能地自動補全和類型檢驗的多編輯器支持, 以及自動格式化代碼等等。
Rust 相關概念
- channel:Rust?會發布3個不同版本:stable、beta、nightly。
? ? ? ? stable:Rust 的穩定版本,每 6 周發布一次。
? ? ? ? beta:Rust 的公開測試版本,將是下一個 stable 版本。
? ? ? ? nightly:每天更新,包含以一些實驗性的新特性。 - toolchain:一套 Rust 組件,包括編譯器及其相關工具,并且包含 channel,版本及支持的平臺信息。
- target:指編譯的目標平臺,即:編譯后的程序在哪種操作系統上運行。
- component (組件):toolchain 是由 component 組成的。查看所有可用和已經安裝的組件命令如下:rustup component list。rustup 默認安裝的組件:
? ? ? ? rustc:Rust 編譯器。
? ? ? ? rust-std:Rust 標準庫。
? ? ? ? cargo:包管理和構建工具。
? ? ? ? rust-docs:Rust 文檔。
? ? ? ? rustfmt:用來格式化 Rust 源代碼。
? ? ? ? clippy:Rust 的代碼檢查工具。 - profile:為了方便對 component 進行管理,使用 profile 定義一組 component。不同的 profile 包含不同的組件,安裝 rustup 時有三種 profile 可選,修改 profile 命令如下:rustup set profile minimal
- Rustup?是什么:Rustup?是 Rust安裝器和版本管理工具。安裝 Rust 的主要方式是通過 Rustup 這一工具,它既是一個 Rust 安裝器又是一個版本管理工具。Rust 的升級非常頻繁。運行?
rustup update
?獲取最新版本的 Rust。文檔:https://rust-lang.github.io/rustup/ - Cargo 是什么:Cargo?是?Rust 的 構建工具 和 包管理器。安裝?Rustup?時會自動安裝。Cargo 可以做很多事情:
? ? ? ? cargo build? ? ? 可以構建項目
? ? ? ? cargo run? ? ? ? 可以運行項目
? ? ? ? cargo test? ? ? ?可以測試項目
? ? ? ? cargo doc? ? ? ?可以為項目構建文檔
? ? ? ? cargo publish 可以將庫發布到 crates.io。
檢查是否安裝了 Rust 和 Cargo,可以在終端中運行:cargo --version
下載、安裝
下載:https://www.rust-lang.org/tools/install
安裝:https://www.rust-lang.org/zh-CN/learn/get-started
默認情況,Rust 依賴 C++ build tools,沒有安裝也關系。安裝過程需要保證網絡正常。
在 Rust 開發環境中,所有工具都安裝在 ~/.cargo/bin 目錄中,可以在這里找到包括 rustc、cargo 和 rustup 在內的 Rust 工具鏈。在安裝過程中,rustup 會嘗試配置 PATH,如果 rustup 對 PATH 的修改不生效,可以手動添加路徑到?PATH
~/.cargo/bin
~/.rustup/bin
以下是一些常用的命令:
rustup 相關
rustup -h ? ? ? ? ? ? ? ?# 查看幫助
rustup show ? ? ? ? ? ? ?# 顯示當前安裝的工具鏈信息
rustup update ? ? ? ? ? ?# 檢查安裝更新
rustup self uninstall ? ?# 卸載
rustup default stable-x86_64-pc-windows-gnu ? ?# 設置當前默認工具鏈rustup toolchain list ? ?# 查看工具鏈
rustup toolchain install stable-x86_64-pc-windows-gnu ? ?# 安裝工具鏈
rustup toolchain uninstall stable-x86_64-pc-windows-gnu ?# 卸載工具鏈
rustup toolchain link <toolchain-name> "<toolchain-path>" ? ?# 設置自定義工具鏈rustup override list ? ?# 查看已設置的默認工具鏈
rustup override set <toolchain> --path <path> ? ?# 設置該目錄以及其子目錄的默認工具鏈
rustup override unset --path <path> ? ?# 取消目錄以及其子目錄的默認工具鏈rustup target list ? ? ? ? ? ? ? # 查看目標列表
rustup target add <target> ? ? ? # 安裝目標
rustup target remove <target> ? ?# 卸載目標
rustup target add --toolchain <toolchain> <target> ? ?# 為特定工具鏈安裝目標rustup component list ? ? ? ? ? ? ? ? # 查看可用組件
rustup component add <component> ? ? ?# 安裝組件
rustup component remove <component> ? # 卸載組件
rustc 相關
rustc --version ? ?# 查看rustc版本
cargo 相關
cargo --version ? ?# 查看cargo版本
cargo new <project_name> ? ?# 新建項目
cargo build ? ?# 構建項目
cargo run ? ? ?# 運行項目
cargo check ? ?# 檢查項目
cargo -h ? ? ? # 查看幫助
配置工具鏈安裝位置
在系統環境變量中添加如下變量:
CARGO_HOME 指定 cargo 的安裝目錄
RUSTUP_HOME 指定 rustup 的安裝目錄
默認分別安裝到用戶目錄下的.cargo 和.rustup 目錄
配置國內鏡像
配置 rustup 國內鏡像。在系統環境變量中添加如下變量(選一個就可以,可以組合):
# 清華大學
RUSTUP_DIST_SERVER:https://mirrors.tuna.tsinghua.edu.cn/rustup
RUSTUP_UPDATE_ROOT:https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup# 中國科學技術大學
RUSTUP_DIST_SERVER:https://mirrors.ustc.edu.cn/rust-static
RUSTUP_UPDATE_ROOT:https://mirrors.ustc.edu.cn/rust-static/rustup
配置 cargo 國內鏡像。在 cargo 安裝目錄下新建 config 文件(注意 config 沒有任何后綴),文件內容如下:
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'tuna'# 清華大學
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"# 中國科學技術大學
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
# 設置代理
[http]
proxy = "127.0.0.1:8889"
[https]
proxy = "127.0.0.1:8889"
Windows 交叉編譯 Linux 程序。目標服務器是?Linux(CentOS 7) 64bit
, 所以我們添加的 target 應該是x86_64-unknown-linux-gnu
(動態依賴) 或者x86_64-unknown-linux-musl
(靜態依賴)
- 動態依賴:目標服務器需要包含動態依賴的相關庫(用戶共享庫)
- 靜態依賴,目標服務器不需要包含相應的庫,但是打包文件會更大些
1). 添加需要的 target
rustup target add ?x86_64-unknown-linux-musl
2). 在 cargo 安裝目錄下新建 config 文件(注意 config 沒有任何后綴),添加的文件內容如下:
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
3). 構建
cargo build --target x86_64-unknown-linux-musl
示例:
創建新項目
用 Cargo 創建一個新項目。在終端中執行:cargo new hello-rust,會生成一個名為?hello-rust
?的新目錄,其中包含以下文件:
Cargo.toml
?為 Rust 的清單文件。其中包含了項目的元數據和依賴庫。src/main.rs
?為編寫應用代碼的地方。
進入新創建的目錄中,執行命令運行此程序:cargo run
添加 依賴
現在來為程序添加依賴。可以在?crates.io,即 Rust 包的倉庫中找到所有類別的庫。在 Rust 中通常把 "包" 稱作 "crates"。在本項目中,使用了名為?ferris-says?的庫。
在?Cargo.toml
?文件中添加以下信息(從 crate 頁面上獲取):
[dependencies]
ferris-says = "0.3.1"
下載 依賴
運行:cargo build? ,?Cargo 就會安裝該依賴。運行?build?會創建一個新文件?
Cargo.lock
,該文件記錄了本地所用依賴庫的精確版本。
使用?依賴
使用該依賴庫:可以打開?
main.rs
,刪除其中所有的內容(它不過是個示例而已),然后在其中添加下面這行代碼:use ferris_says::say;這樣就可以使用?
ferris-says
?crate 中導出的?say
?函數了。
完整?Rust?示例
現在用上面的依賴庫編寫一個小應用。在?main.rs
?中添加以下代碼:
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};fn main() {let stdout = stdout();let message = String::from("Hello fellow Rustaceans!");let width = message.chars().count();let mut writer = BufWriter::new(stdout.lock());say(&message, width, &mut writer).unwrap();
}
保存完畢后,執行命令運行程序:cargo run
成功執行后,會打印一個字符形式的螃蟹圖案。
Ferris (?費理斯 )?是 Rust 社區的非官方吉祥物。
2、Rust?相關文檔
:https://www.rust-lang.org/zh-CN/learn
核心文檔
以下所有文檔都可以用?rustup doc
?命令在本地閱讀,它會在瀏覽器中離線打開這些資源!
標準庫
詳盡的 Rust 標準庫 API 手冊。:https://doc.rust-lang.org/std/index.html
版本指南
Rust 版本指南。:https://doc.rust-lang.org/edition-guide/index.html
CARGO 手冊
Rust 的包管理器和構建系統。:https://doc.rust-lang.org/cargo/index.html
RUSTDOC 手冊
學習如何為?crate 編寫完美的文檔。:https://doc.rust-lang.org/rustdoc/index.html
RUSTC 手冊
熟悉 Rust 編譯器中可用的選項。:https://doc.rust-lang.org/rustc/index.html
編譯錯誤索引表
深入解釋遇到的編譯錯誤。:https://doc.rust-lang.org/error_codes/error-index.html
Rust?程序
命令行?程序
用 Rust 構建高效的命令行應用。:https://rust-cli.github.io/book/index.html
WEBASSEMBLY 手冊
通過 WebAssembly 用 Rust 構建瀏覽器原生的庫。:https://rustwasm.github.io/docs/book/
嵌入式手冊
Rust 編寫嵌入式程序。:https://doc.rust-lang.org/stable/embedded-book/
3、Rust 程序設計語言
英文文檔:https://doc.rust-lang.org/book/
中文文檔:https://kaisery.github.io/trpl-zh-cn/
《Rust 程序設計語言》被親切地稱為“圣經”。給出了 Rust 語言的概覽。在閱讀的過程中構建幾個項目,讀完后,就能扎實地掌握 Rust 語言。
- 1.?入門指南
-
- 1.1.?安裝
- 1.2.?Hello, World!
- 1.3.?Hello, Cargo!
- 2.?寫個猜數字游戲
- 3.?常見編程概念
-
- 3.1.?變量與可變性
- 3.2.?數據類型
- 3.3.?函數
- 3.4.?注釋
- 3.5.?控制流
- 4.?認識所有權
-
- 4.1.?什么是所有權?
- 4.2.?引用與借用
- 4.3.?Slice 類型
- 5.?使用結構體組織相關聯的數據
-
- 5.1.?結構體的定義和實例化
- 5.2.?結構體示例程序
- 5.3.?方法語法
- 6.?枚舉和模式匹配
-
- 6.1.?枚舉的定義
- 6.2.?match 控制流結構
- 6.3.?if let 簡潔控制流
- 7.?使用包、Crate 和模塊管理不斷增長的項目
-
- 7.1.?包和 Crate
- 7.2.?定義模塊來控制作用域與私有性
- 7.3.?引用模塊項目的路徑
- 7.4.?使用 use 關鍵字將路徑引入作用域
- 7.5.?將模塊拆分成多個文件
- 8.?常見集合
-
- 8.1.?使用 Vector 儲存列表
- 8.2.?使用字符串儲存 UTF-8 編碼的文本
- 8.3.?使用 Hash Map 儲存鍵值對
- 9.?錯誤處理
-
- 9.1.?用 panic! 處理不可恢復的錯誤
- 9.2.?用 Result 處理可恢復的錯誤
- 9.3.?要不要 panic!
- 10.?泛型、Trait 和生命周期
-
- 10.1.?泛型數據類型
- 10.2.?Trait:定義共同行為
- 10.3.?生命周期確保引用有效
- 11.?編寫自動化測試
-
- 11.1.?如何編寫測試
- 11.2.?控制測試如何運行
- 11.3.?測試的組織結構
- 12.?一個 I/O 項目:構建命令行程序
-
- 12.1.?接受命令行參數
- 12.2.?讀取文件
- 12.3.?重構以改進模塊化與錯誤處理
- 12.4.?采用測試驅動開發完善庫的功能
- 12.5.?處理環境變量
- 12.6.?將錯誤信息輸出到標準錯誤而不是標準輸出
- 13.?Rust 中的函數式語言功能:迭代器與閉包
-
- 13.1.?閉包:可以捕獲其環境的匿名函數
- 13.2.?使用迭代器處理元素序列
- 13.3.?改進之前的 I/O 項目
- 13.4.?性能比較:循環對迭代器
- 14.?更多關于 Cargo 和 Crates.io 的內容
-
- 14.1.?采用發布配置自定義構建
- 14.2.?將 crate 發布到 Crates.io
- 14.3.?Cargo 工作空間
- 14.4.?使用 cargo install 安裝二進制文件
- 14.5.?Cargo 自定義擴展命令
- 15.?智能指針
-
- 15.1.?使用Box<T> 指向堆上數據
- 15.2.?使用Deref Trait 將智能指針當作常規引用處理
- 15.3.?使用Drop Trait 運行清理代碼
- 15.4.?Rc<T> 引用計數智能指針
- 15.5.?RefCell<T> 與內部可變性模式
- 15.6.?引用循環會導致內存泄漏
- 16.?無畏并發
-
- 16.1.?使用線程同時地運行代碼
- 16.2.?使用消息傳遞在線程間通信
- 16.3.?共享狀態并發
- 16.4.?使用Sync 與 Send Traits 的可擴展并發
- 17.?Rust 的面向對象編程特性
-
- 17.1.?面向對象語言的特點
- 17.2.?為使用不同類型的值而設計的 trait 對象
- 17.3.?面向對象設計模式的實現
- 18.?模式與模式匹配
-
- 18.1.?所有可能會用到模式的位置
- 18.2.?Refutability(可反駁性): 模式是否會匹配失效
- 18.3.?模式語法
- 19.?高級特征
-
- 19.1.?不安全的 Rust
- 19.2.?高級 trait
- 19.3.?高級類型
- 19.4.?高級函數與閉包
- 19.5.?宏
- 20.?最后的項目:構建多線程 web server
-
- 20.1.?建立單線程 web server
- 20.2.?將單線程 server 變為多線程 server
- 20.3.?優雅停機與清理
- 21.?附錄
-
- 21.1.?A - 關鍵字
- 21.2.?B - 運算符與符號
- 21.3.?C - 可派生的 trait
- 21.4.?D - 實用開發工具
- 21.5.?E - 版本
- 21.6.?F - 本書譯本
- 21.7.?G - Rust 是如何開發的與 “Nightly Rust”
4、通過例子學 Rust
英文文檔:https://doc.rust-lang.org/rust-by-example/
中文文檔:https://rustwiki.org/zh-CN/rust-by-example/
查看更多?Rust 官方文檔中英文雙語教程,包括雙語版《Rust 程序設計語言》(出版書名為《Rust 權威指南》),?Rust 標準庫中文版。
《通過例子學 Rust》(Rust By Example 中文版)翻譯自?Rust By Example,中文版最后更新時間:2022-1-26。查看此書的?Github 翻譯項目和源碼。
開始學習吧!
-
Hello World?- 從經典的 “Hello World” 程序開始學習。
-
原生類型?- 學習有符號整型,無符號整型和其他原生類型。
-
自定義類型?- 結構體?
struct
?和 枚舉?enum
。 -
變量綁定?- 變量綁定,作用域,變量遮蔽。
-
類型系統?- 學習改變和定義類型。
-
類型轉換
-
表達式
-
流程控制?-?
if
/else
,for
,以及其他流程控制有關內容。 -
函數?- 學習方法、閉包和高階函數。
-
模塊?- 使用模塊來組織代碼。
-
Crate?- crate 是 Rust 中的編譯單元。學習創建一個庫。
-
Cargo?- 學習官方的 Rust 包管理工具的一些基本功能。
-
屬性?- 屬性是應用于某些模塊、crate 或項的元數據(metadata)。
-
泛型?- 學習編寫能夠適用于多種類型參數的函數或數據類型。
-
作用域規則?- 作用域在所有權(ownership)、借用(borrowing)和生命周期(lifetime)中起著重要作用。
-
特性 trait?- trait 是對未知類型(
Self
)定義的方法集。 -
宏
-
錯誤處理?- 學習 Rust 語言處理失敗的方式。
-
標準庫類型?- 學習?
std
?標準庫提供的一些自定義類型。 -
標準庫更多介紹?- 更多關于文件處理、線程的自定義類型。
-
測試?- Rust 語言的各種測試手段。
-
不安全操作
-
兼容性
-
補充?- 文檔和基準測試