傳送門:
深入淺出Rust(第一部分-1)
深入淺出Rust(第一部分-2)
深入淺出Rust(第二部分-1)
深入淺出Rust(第二部分-2)
深入淺出Rust(第三部分-1)
深入淺出Rust(第三部分-2)
深入淺出Rust(第四部分)
深入淺出Rust(第五部分)
第五部分 -實(shí)用設(shè)施
第32章 項(xiàng)目和模塊
到最后才開始講cargo,確實(shí)這個(gè)不是語法層面的東西.
1. cargo
- Rust管理項(xiàng)目的概念(crate-編譯單元, mod-命名空間)
- Cargo.toml管理crate基本的依賴
- 項(xiàng)目依賴(直接版本,從crate.io查找;git=倉庫地址,path=本地地址)
- workspace是cargo管理多個(gè)項(xiàng)目的概念,可以同時(shí)管理,生成統(tǒng)一的Cargo.lock
3. 模塊管理
- mod用于在crate內(nèi)部進(jìn)行分層和封裝
- mod與use配套使用.
- mod內(nèi)部默認(rèn)可見性為私有,pub trait,pub enum默認(rèn)是公開.
第33章 錯(cuò)誤處理
Rust錯(cuò)誤分為: 不可恢復(fù)錯(cuò)誤(Panic),可恢復(fù)錯(cuò)誤(Result)
1. 基本錯(cuò)誤處理
- 使用Option<>包裝,使得返回不需要判斷Null空指針.
- 使用std::result::Result對(duì)錯(cuò)誤進(jìn)行包裝,可以很好地處理Err分支情況
2. 組合錯(cuò)誤類型
33-1.png
3. 問號(hào)運(yùn)算符
- 通過?運(yùn)算符簡化錯(cuò)誤處理,如果結(jié)果是Err,則提前返回,否則繼續(xù)執(zhí)行.
- 這個(gè)需要對(duì)返回值Result中的Err進(jìn)行統(tǒng)一規(guī)整才行,std::error:Error
4. main函數(shù)使用?運(yùn)算符
- 修改main函數(shù)簽名.
5. Failure庫
- 解決description基本沒用,無法回溯,Box<Error>線程不安全等問題
- failure::Fail 繼承Send+Sync,自動(dòng)derive
- 替代原有Error需要修改部分代碼
第34章 FFI
本書僅簡單介紹,后續(xù)再深入吧.
1. 什么是FFI
34-1.png
FFI(Foreign Function Interface)是用來與其它語言交互的接口,在有些語言里面稱為語言綁定(language bindings),Java 里面一般稱為 JNI(Java Native Interface) 或 JNA(Java Native Access)。由于現(xiàn)實(shí)中很多程序是由不同編程語言寫的,必然會(huì)涉及到跨語言調(diào)用,比如 A 語言寫的函數(shù)如果想在 B 語言里面調(diào)用,這時(shí)一般有兩種解決方案:一種是將函數(shù)做成一個(gè)服務(wù),通過進(jìn)程間通信(IPC)或網(wǎng)絡(luò)協(xié)議通信(RPC, RESTful等);另一種就是直接通過 FFI 調(diào)用。前者需要至少兩個(gè)獨(dú)立的進(jìn)程才能實(shí)現(xiàn),而后者直接將其它語言的接口內(nèi)嵌到本語言中,所以調(diào)用效率比前者高。
- rustc在編譯時(shí)候可以指定編譯目標(biāo)為cdylib和staticlib編譯出與C語言的ABI兼容的動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫
- 不是所有的Rust語言特性都時(shí)候放到交互接口的,比如泛型,C沒有,就無法作為FFI接口
2. 從C調(diào)用Rust庫
- Rust中增加extern "C" fn的簽名.
- C中通過extern void ...的聲明引入,編譯增加靜態(tài)庫鏈接-l
3. 從Rust調(diào)用C庫
- C中g(shù)cc -c + ar 生成靜態(tài)庫 .a
- Rust里面使用#[link(name=×)] extern "C" {}聲明引入,編譯增加靜態(tài)庫鏈接-L
4. 更復(fù)雜的數(shù)據(jù)類型
- 結(jié)構(gòu)體通過#[repr(C)]修飾,結(jié)構(gòu)體聲明兩邊都要有,且保持兼容
- libc庫封裝了常用的OS交互
- 代碼-略
第35章 文檔和測(cè)試
1. 文檔
- 注釋規(guī)范: /// 給后面的元素說明,//! 給包含文檔元素說明,// 普通注釋
- 文檔內(nèi)部支持markdown格式
- 可以單獨(dú)寫md,通過attribute指定--例如:#[doc(include="extenal-doc.md")]
2. 測(cè)試
- rust中測(cè)試可以直接和代碼寫一起
- 通過#[cfg(test)]的attribute指定mod,(類似spring的profile),這樣cargo test時(shí)候就能自動(dòng)識(shí)別
- 通過#[test],#[ignore]控制測(cè)試執(zhí)行(又類似junit)
- 通過#[bench]添加性能測(cè)試,此時(shí)有個(gè)參數(shù)b: &mut bencher,傳入重復(fù)次數(shù)
- assert!宏可以校驗(yàn)測(cè)試結(jié)果
- 總體來說,Rust提供的測(cè)試框架是一個(gè)輕量級(jí)的框架.