# 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}]"}