深入淺出Rust(第一部分-1)

封面.png

傳送門:
深入淺出Rust(第一部分-1)
深入淺出Rust(第一部分-2)
深入淺出Rust(第二部分-1)
深入淺出Rust(第二部分-2)
深入淺出Rust(第三部分-1)
深入淺出Rust(第三部分-2)
深入淺出Rust(第四部分)
深入淺出Rust(第五部分)


寫在前面

顯然我拿錯書作為入門讀物了."既來之,則安之",雖然有點難,還是完整看了下來.收獲頗多..

第一部分-1

第1章 與君初相見

1-1.png

關注高效和安全的開發語言.

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不檢查,自動舍棄高位.

2-1.png
2-2.png
2-3.png

3. 復合數據類型

3.1 元組tuple(和python的幾乎一樣)

存在空元組unit(單元類型),占用0空間

3.2 結構struct(和Go的幾乎一樣)

存在空結構; ..expr展開表達式(僅用于初始化);

3.3 元組結構tuple struct

成員沒有名字的struct,與結構不同在于定義類型是后面是"("

2-4.png

3.4 枚舉enum(多類型"或"關系)

定義語法與struct類似.
枚舉一般與模式匹配match配套使用

2-5.png

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目前并沒有尾調用優化,遞歸層數太多,可能引起調用棧被撐爆

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容