|
|
行 2: |
行 2: |
|
| |
|
| =Programming Rust筆記= | | =Programming Rust筆記= |
| ==Ch1概論==
| | 參見:[[Programming Rust筆記]] |
| *系統程式語言有「未定義行為」。
| |
| *使用者輸入的內容可能會導致程式漏洞。
| |
| ** 編譯時消除未定義行為
| |
| ** 安全,亦於使用
| |
| ** 平行編譯
| |
| ** 0 overhead的C++,只有必要花費,不會花費太多資源消耗
| |
| ** 善用底層
| |
| ** cargo、trait、generic
| |
| ==Ch2 Rust特性簡單導覽==
| |
| * rust doc產生文件
| |
| * rust編譯器
| |
| * cargo編譯管理器
| |
| ** cargo clean清除編譯文件
| |
| ** cargo new --vcs none #不生成.gitignore
| |
| ** cargo run # 直接編譯系統執行
| |
| | |
| * 通常不用寫return。沒有<code>;</code>結尾的視為回傳值。
| |
| | |
| * 函數定義示例:
| |
| <pre>fn foo(mut n :i64) -> i64{
| |
| ...
| |
| }</pre>
| |
| | |
| <code>assert!(a == b)</code>錯誤時拋出panic
| |
| | |
| | |
| * identifier後面的<code>!</code>為巨集
| |
| * <code>let x = m</code>可以這樣寫,會儘可能型別推論。比較<code>let x : i64 = m</code>。let 表局域變數。
| |
| * 4空白是縮排標準。
| |
| * i32 u8 f32(C float) f64(C double)
| |
| * mut 指示可變變數
| |
| * assert! 一定會被執行。debug_assert!正式執行時候不會執行此assertion。
| |
| | |
| <pre>
| |
| #![test] // attribution,控制編譯器、code style,或檢視條件加入程式碼。
| |
| fn test_gcd(){
| |
| assert_eq!(foo(x), rhs); #檢查左右有沒有相等的assertion
| |
| }
| |
| </pre>
| |
| | |
| *Vec::new() // 類似Python的List
| |
| * use std::str::FromStr; 和 use std::env:呼叫外部函式庫
| |
| * rustup doc --std # 生成標準函式庫文件
| |
| * <code>for arg in env::args().skip(1)</code> 跳過第一個argument,取值跑迴圈。
| |
| * numVec.push(item); #將item往後附加於numVec
| |
| * u64::from_str(numInStr).expect("errorMsg") // 回傳 result = Ok(v) | Err(e),若是Err則吐出 "errorMsg"。
| |
| * eprintln!("err"); #寫到標準錯誤輸出流
| |
| <pre>
| |
| for m in &numbers[1..]{
| |
| d = gcd(d, *m);
| |
| | |
| }
| |
| </pre>
| |
| | |
| 上方的&表示m只是一個ref,將numbers借用,不改變numbers這個變數的所有權。
| |
| | |
| * m 表示將ref轉成值,deref。
| |
| * std::process::exit(1); 輸出錯誤回傳值1。
| |
| * println!("...{}...{:?}", a, b); // {} 和{...}都是template-string。
| |
|
| |
|
| =其他= | | =其他= |