Programming Rust筆記
於 2024年7月29日 (一) 23:12 由 Tankianting(討論 | 貢獻) 所做的修訂
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。