Programming Rust筆記

這是書本的筆記或心得,相關資訊:

作者:Jim Blandy, Jason Orendorff & Leonora F.S. Tindall

書號:ISBN 9781492052593

Version 2 的筆記

Ch1概論

  • 系統程式語言有「未定義行為」。
  • 使用者輸入的內容可能會導致程式漏洞。
    • 編譯時消除未定義行為
    • 安全,亦於使用
    • 平行編譯
    • 0 overhead的C++,只有必要花費,不會花費太多資源消耗
    • 善用底層
    • cargo、trait、generic

Ch2 Rust特性簡單導覽

  • rust doc產生文件
  • rust編譯器
  • cargo編譯管理器
    • cargo clean清除編譯文件
    • cargo new --vcs none #不生成.gitignore
    • cargo run # 直接編譯系統執行
  • 通常不用寫return。沒有;結尾的視為回傳值。
  • 函數定義示例:
fn foo(mut n :i64) -> i64{
...
}

assert!(a == b)錯誤時拋出panic


  • identifier後面的!為巨集
  • let x = m可以這樣寫,會儘可能型別推論。比較let x : i64 = m。let 表局域變數。
  • 4空白是縮排標準。
  • i32 u8 f32(C float) f64(C double)
  • mut 指示可變變數
  • assert! 一定會被執行。debug_assert!正式執行時候不會執行此assertion。
#![test] // attribution,控制編譯器、code style,或檢視條件加入程式碼。
fn test_gcd(){
assert_eq!(foo(x), rhs); #檢查左右有沒有相等的assertion
}
  • Vec::new() // 類似Python的List
  • use std::str::FromStr; 和 use std::env:呼叫外部函式庫
  • rustup doc --std # 生成標準函式庫文件
  • for arg in env::args().skip(1) 跳過第一個argument,取值跑迴圈。
  • numVec.push(item); #將item往後附加於numVec
  • u64::from_str(numInStr).expect("errorMsg") // 回傳 result = Ok(v) | Err(e),若是Err則吐出 "errorMsg"。
  • eprintln!("err"); #寫到標準錯誤輸出流
for m in &numbers[1..]{
  d = gcd(d, *m);

}

上方的&表示m只是一個ref,將numbers借用,不改變numbers這個變數的所有權。

  • m 表示將ref轉成值,deref。
  • std::process::exit(1); 輸出錯誤回傳值1。
  • println!("...{}...{:?}", a, b); // {} 和{...}都是template-string。

rust支援concurrency。

使用mutex,並且此處顯示多執行緒的撰寫

all rust functions are thread-safe

loop{x = x * x;}

上文是loop語句

num library有複數。

 Complex<T>{
 re:T, //實部
 im:T // 虛部
 }
Complex<f32> // 用f32存

let c = Complex{re: 0.24, im 0.3};

c.re == 0.24;
c.im == 0.3;

enum Option<T>{
None,
Some(T),
}

比較

result option
Ok(x) Some(x)
Err(e) None
let x = (2,3) // tuple
//x.0 == 2 第0個元素
//x.1 == 3 第1個元素


2.0 as f64 // 強制指定型別

crossbeam:建構concurrency的函式庫

  1. [derive(Debug)] // 用 {:?}可以做除錯

use regex::Regex; //使用regex

let regex = Regec::new(target)?; // ? 是使Error浮上的方式,類似if (Error){Error}{content; /* Ok(content)取出content */}

regex.replace_all(text, replacement).to_string()
                   ↑&str  ↑&str

Ch3 基本型別

Rust有型別推論和多型(解決鴨子型別,就是有函數或性質同名的就可執行,但是難以找到錯誤。Python、JS使用)

P.51列出範例型別

struct E; 類Unit型別

Box<A> 有指標指到heap裡面

&reference 參照

[f64; 4]矩陣

String 動態大小字串 "example".to_string()

Vec<f64> 可變長度矩陣

trait object:

引用到任何實作特定方法集合的值

&dyn Any, [value as &dyn Any,]

fn(&str) -> bool

Closure 沒有型別表達方式

|a, b| {a+b} enum Attend {OnTime, Late(u32)}

詳細說明 struct -> Ch9 enum -> Ch10 String and str -> Ch17 細節 trait -> Ch11 function & closure -> Ch14

基本數有u8, i8, u16, i16, u32, i32,u128, i128 f32, f64等

任意精度數在 num crate

char 不是u8也非u32

42u8, 1729isize ->數字後加型別,可以強制指定型別。

預設用i32

b'a' = 65u8 // byte literal

b'\ , b'\\', b'\n', b'\r', b'\t' -> 脫逸字元

b'\x1b' = 27 // (0x1b = 27,escape字元)

10_i8 as u16 -> 轉換到 u16