傳送門:
深入淺出Rust(第一部分-1)
深入淺出Rust(第一部分-2)
深入淺出Rust(第二部分-1)
深入淺出Rust(第二部分-2)
深入淺出Rust(第三部分-1)
深入淺出Rust(第三部分-2)
深入淺出Rust(第四部分)
深入淺出Rust(第五部分)
寫在前面
顯然我拿錯書作為入門讀物了."既來之,則安之",雖然有點難,還是完整看了下來.收獲頗多..
第一部分-1
第1章 與君初相見
關注高效和安全的開發語言.
1. 版本和發布策略
RFC->Nightly->Beta->Stable
官網: rust-lang.org
官方倉庫: crates.io
playground: https://play.rust-lang.org/
std: https://doc.rust-lang.org/std/index.html
2. 安裝
官網的Install鏈接即可,Windows需要VC++工具鏈,需要安裝Visual Studio開發工具,這個和nodeJs的一樣.
工具 | 作用 |
---|---|
rustup | Rust 版本管理 |
rustc | 編譯器 |
cargo | 包管理 |
3. hello world
4. Prelude
Rust默認會自動引入對標準庫的依賴. use std::prelude::*
5. Format格式
有!的是Rust的宏調用,宏能做到更好的錯誤檢查.
第2章 變量和類型
1. 變量聲明
let variable: i32 = 100;
1.1 默認變量聲明是只讀的,如果加上mut,變為可寫變量,實際上是模式解構,這個C#,ES6就有,很熟了.
1.2 Rust允許同一代碼塊聲明同樣名字的變量,后面就會將前面遮蔽起來.
1.3 Rust支持類型推導,這種推導是依賴編譯器的,而非動態類型系統,也就是說如果編譯器無法通過上下文感知具體的類型,就會報錯.因此函數簽名不允許進行推導,需要具體寫出.
使用type聲明別名,這和Go基本一樣,由于支持泛型,Rust更靈活點.
1.4 static關鍵字聲明靜態變量:
static GLOBAL: i32 = 0;
其生命周期是整個程序,也就是全局變量.具體要求:
a. 必須馬上初始化
b. 其初始化值必須是在編譯期可以確定的常量.不支持表達式和函數調用(這需要運行時才知道)
c. 帶有mut的靜態變量,需要加上unsafe關鍵字.
d. 復雜的static變量通常使用lazy模式,第一次使用時候初始化. -> lazy_static 庫
1.5 const常量
2. 基本數據類型
bool,char(unicode),整數(8-128bit,指針,溢出),浮點數(IEEE 754-2008),指針,類型轉換
debug模式進行整數溢出檢查,溢出則引發panic;而release不檢查,自動舍棄高位.
3. 復合數據類型
3.1 元組tuple(和python的幾乎一樣)
存在空元組unit(單元類型),占用0空間
3.2 結構struct(和Go的幾乎一樣)
存在空結構; ..expr展開表達式(僅用于初始化);
3.3 元組結構tuple struct
成員沒有名字的struct,與結構不同在于定義類型是后面是"("
3.4 枚舉enum(多類型"或"關系)
定義語法與struct類似.
枚舉一般與模式匹配match配套使用
3.5 類型遞歸定義
通過裝箱Box可以實現類型的遞歸定義(實際僅僅記錄指針)
第3章 語句和表達式
1. 語句
2. 表達式
2.1 運算表達式
+,-,*,/,%,比較(左右必須同類型),位運算,邏輯運算
2.2. 賦值表達式
Rust不允許連續賦值,但支持組合賦值+=,*=
3.3 語句塊表達式{}
和函數一樣,最后一個未結束數據用來返回,如果加了";",那么其類型就是().
3. if-else
語句一定要用{}包裹,而非c,java之類只有一句條件內代碼就省略.
而條件表達式,不需要()包裹.
沒有: ? 三元運算符(可讀性好??)
4. 循環
4.1 loop: 通過break跳出(相當于do-while的變體)
4.2 while: 先設好條件,在循環
4.3 for: 只有for-in (循環內容需要在語句外設定)
第4章 函數
1. 簡介
fn 函數名(參數1:類型1, 參數2:類型2, ...) -> 返回類型
只有參數和返回值一樣的函數可以替換賦值,通過通用fn類型過渡.
2. 發散函數
返回類型是!的函數就是發散函數,代表一個函數執行錯誤(panic),它能夠轉換為任意類型,這樣就允許任何類型的函數拋出異常并處理
3. main函數
Rust中傳遞參數與返回類型處理都有特殊的API,因此main函數一定是無參數,無返回的.
std::env::args() // 輸入參數
std::env::var() // 單個環境變量,返回Option枚舉
std::env::vars() // 所有環境變量列表
std::process::exit(O) // 退出碼
4. const fn
函數常量在編譯階段運行完畢,其返回值也作為常量保存.
5. 函數遞歸
Rust目前并沒有尾調用優化,遞歸層數太多,可能引起調用棧被撐爆