# Rust 環境建置
###### tags: `Rust`
> 本文<font color=orange size=4>僅提出必要概念和與常見語言的差異部分</font>, 將假設讀者認識 C/C++, 並簡單理解現代流行語言 (如 Java、C#、JavaScript/TypeScript) 的特色 (物件導向、泛型、例外處理、基本資料結構、模組化等), 不過當然也可以遇到不知道的概念時去查查 `:)`
<!-- > 整體會依照 [Rust编程语言入门教程](https://www.bilibili.com/video/BV1hp4y1k7SV) 進行, 其 -->
> 使用的參考書是官方的書籍: [The Rust Programming Language](https://doc.rust-lang.org/book/), 輔以我的心得與上網查詢的其他資料, 我會盡可能達到可以僅閱讀此文檔來學會 Rust 語言的程度。
## Rust 常用指令
- Update
```Rust
rustup update
```
- Uninstall
```Rust
rustup self uninstall
```
- Check version
```Rust
rustc --version
cargo --version
```
> 題外話:cargo 的意思是「貨物」
以上指令會得到...
`rustc.x.y.z (COMMIT_HASH, COMMIT_DATE)`
`cargo.x.y.z (COMMIT_HASH, COMMIT_DATE)`
- Offline Document
直接在瀏覽器上開啟離線文本。
```Rust
rustup doc
```
> 超香 `:)`
> Dependency 滑鼠懸停就可查詢文檔這點更香, 詳見 [toml](#基本檔案結構)
## Build <font size=3>(take `Hello World` for example)</font>
### Code
```Rust=
/**
* file name : hello_world.rs
* 以小寫單字用底線串聯為命名習慣
**/
fn main() {
println!("Hello World!"); // tab 為四個空格
}
```
小小解釋:
1. `fn` : 函式
2. `main` : 主函式, 必最先執行
3. `println!` : `Rust Macro` 之一, 與函式的區別在是否加 `!`
### Compile (`rustc`)
```Rust
rustc FILE_NAME.rs
```
會發現在 Windows 下會多一個 `.pdb` 檔 (除錯訊息), 與可以直接運行的 `.exe` 檔

> 這是對小型程式而言...
> 我相信沒人寫 Java、TypeScript Project 時會想要一個個編/轉譯吧...
### Build a Project (`cargo`)
`Cargo` 之於 Rust 就如同 `Maven/Spring/Gradle` 之於 `Java`、`npm` 之於 `TS/JS`, 對整個專案的編譯、打包、引入依賴的庫等操作。
#### 專案指令
1. New Project
```rust
cargo new PROJECT_NAME
```
2. Build Project
```rust
cargo build
```
編譯好的檔案在 `target/debug` 目錄下。
發布時, 可加上引數 `--release`, 對程式碼執行編譯最佳化 (想當然編譯時間會更長)。
此時編譯好的檔案會在 `target/release` 目錄下。
<details>
<summary>
普通 Build 與加 --release 的目錄結構長相
</summary>

</details>
3. Build and Run Project
```rust
cargo run
```
> 若已經編譯過且未修改原始碼, 會跳過編譯階段直接運行。
4. JUST Check
此指令僅<font color=cd5c5c>確保能通過編譯</font>。
```rust
cargo check
```
> 跟 `cargo build` 比起來快很多, 十毫秒掃十六個檔案不在話下。
5. Update dependencies
```rust
cargo update
```
這將會將依賴的版本<font color=orange>升級到預設大版本下的最高小版本</font>, 可見於 `Cargo.lock`。
> 欲更新依賴的大版本, 修改 Cargo.toml 的版本號即可。
#### 基本檔案結構

1. `Cargo.toml` ~~pom.xml~~

`TOML = Tom's Obvious, Minimal Language` ([Tom 就是此設定檔的發明者](https://zh.wikipedia.org/wiki/TOML))
宗旨是簡單易用。
注意:<font color="#cd5c5c">Dependencies 在 Rust 裡稱為</font> <font size=4>`crate`</font>
> 題外話:crate 的意思是箱子
> 可以在 <https://crates.io/crates/> 找到各種 `crates`
2. `Cargo.lock`
自動追蹤 Dependencies 的版本, 可以保證咱的程式碼<font color=orange>到哪處都可以重現</font> (引用相同版本的依賴)。
> 沒事不用改它。
{"metaMigratedAt":"2023-06-17T16:03:17.226Z","metaMigratedFrom":"Content","title":"Rust 環境建置","breaks":true,"contributors":"[{\"id\":\"646bc1c5-da08-4ef1-a5ae-7281c8271532\",\"add\":2902,\"del\":1}]"}