# Hello Rust ## Week 0A ---- ## Introduction + 原本是 [Graydon Hoare](https://github.com/graydon) 的個人專案 + 在 2010 年首次公開 + 由 Mozilla 資助與主導開發 + 很大部分來自於社群的貢獻 ---- ## Feature + 效能 + 編譯報錯 + 記憶體安全 + 空指標、所有權、智慧指標 ---- ## Resources + [官方文件](https://doc.rust-lang.org/book/) + [中文版](https://rust-lang.tw/book-tw/) ---- ## Environment + 透過以下指令安裝: ```sh curl --proto '=https' \ --tlsv1.3 'https://sh.rustup.rs' -sSf | sh ``` + 獲得 `rustc`, `rustup`, `cargo` 等指令 + 取得版本資訊 `rustc --version` + 更新版本 `rustup update` ---- ## Plugins + [Better TOML](https://tinyurl.com/mu9wc4zb) + [rust-analyzer](https://tinyurl.com/yy7369mv) ---- ## Basic Commands + 編譯程式 `rustc main.rs` + 新建專案 `cargo new <project_name>` + 建置專案 `cargo build [--release]`, `cargo b [-r]` + 執行專案 `cargo run`, `cargo r` --- # Declaration ---- ## Variables & Constant + 存放數值的方式分成三種: ```rust= let x = 1; // 不可變變數 let mut y = 2; // 可變變數 const z: u32 = 3; // 常數 ``` ---- ## `let` vs `const` + `let` 的數值在程式運作期間決定 + 例如 Function 的回傳值 + `const` 的數值在編譯期間決定 + 不能接 Function 的回傳值 ---- ## `let` vs `const` + `let` 的型別可以由編譯器推斷 ```rust let s = "abc"; // type: &str let s = s.len(); // type: usize ``` + `const` 的型別必須在編譯前指定 ```rust let C: u32 = 123; ``` ---- ## Numeric Data Types <div style="font-size: 0.9em"> | | | |:----- |:---------------------------------| |  整數 | `i8, i16, i32, i64, i128, isize` | | 正整數 | `u8, u16, u32, u64, u128, usize` | | 浮點數 | `f32, f64` | | 布林值 | `bool (true, false)` | |  字元 | `char` | </div> ---- ## `isize` & `usize` + 因為在不同機器上,記憶體定址的範圍並不相同,例如 32 位元只能定址到 4 Bytes 但 64 位元可以定址到 8 Bytes,所以有了 `isize` 與 `usize` 來表示這個範圍。 ---- ## Tuple ```rust= // 宣告 Tuple let t1: (i32, f64, char) = (123, 94.87, '🤔'); // 取用 Tuple 的元素 println!("{} {} {}", t1.0, t1.1, t1.2); // 解構 Tuple 的元素 let (a, b, c) = t1; println!("{a} {b} {c}"); ``` ---- ## Array ```rust= let a1: [u32; 5] = [1, 2, 3, 4, 5]; println!("{a1:?}"); // Print Array let a2 = [3; 5]; // [3, 3, 3, 3, 3] println!("{a2:#?}"); // Pretty Print Array ``` ---- ## Function + Function 包含 Statements 與 Expressions ```rust= fn foo(n: u32) -> u32 { return (n + 10) * 10; } fn func2(n: u32) -> (u32, f64, char) { let m = n as f64 / 10.0; // Statement return (n, m, 'C'); // Expressions } let a: u32 = { let x = 4; x + 1 // 不能加分號 }; ``` ---- ## Comment ```rust= // 單行註解 /* * 多 * 行 * 註 * 解 */ ``` --- # Control Flow ---- ## Condition ```rust= let n = 5; if n < 5 { println!("小於五"); } else if n < 3 { println!("小於三"); } else { println!("都不是") } ``` ---- ## Condition ```rust= let s = if n < 5 { "小於五" } else if n < 3 { "小於三" } else { "都不是" }; println!("s: {s}") ``` ---- ## Loop ```rust= let mut counter = 0; let res = loop { counter += 1; if counter > 10 { // 超屌的 Break 用法 break counter * counter; } }; println!("res: {res}"); ``` ---- ## Labeled Loop ```rust= let mut count = 0; 'outer_loop: loop { println!("Outer Loop {count}"); let mut left = 10; loop { println!("Left: {left}"); if left == 9 { break; } if count == 2 { break 'outer_loop; } left -= 1; } count += 1; } println!("Count: {count}"); ``` ---- ## While Loop ```rust= let mut n = 3; println!("Go While"); while n > 0 { n -= 1; println!("n: {n}") } println!("Bye While"); ``` ---- ## For Loop ```rust= let a = [1, 3, 5, 7, 9]; for aa in a { println!("aa: {aa}") } for n in (1..=4).rev() { println!("n: {n}, a[{n}] = {}", a[n]) } ```
{"metaMigratedAt":"2023-06-17T23:27:54.267Z","metaMigratedFrom":"YAML","title":"Week 0A - Hello Rust","breaks":true,"description":"地獄貓旅行團第十週心得分享","slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"c7cbb212-2c41-4dfa-8d85-f8e7fa769bf1\",\"add\":4185,\"del\":360}]"}
    142 views
   Owned this note