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