Programming Rust筆記

於 2024年9月3日 (二) 01:29 由 Tankianting討論 | 貢獻 所做的修訂

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

作者: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的函式庫