繼上一篇認識了 Rust 之後,我們現在就趕緊踏上學習 Rust 的 不歸路 旅程吧!

本系列主頁面:Rust繁中簡學!
繁體中文版 Rustlings:https://github.com/TimLai666/rustlings-zh-TW

安裝 Rust

在開始練習 Rust 之前,我們當然要先安裝 Rust 囉!

到 Rust 官網的 安裝頁面 下載安裝檔,下載好把他打開,這裡以 Windows 示範。

這裡直接按 Enter

這樣就安裝好了,按 Enter 關閉視窗。

下載 Rustlings 庫

安裝好 Rust 之後,下載 Rustlings 的 GitHub 庫,這裡使用我自己翻譯的繁體中文版本。下載方式有兩種:

方法一:到 Github 頁面直接下載

前往 繁體中文版 Rustlings 的 GitHub 頁面

點擊綠色的 Code 按鈕,然後點擊 Download ZIP。或是你也可以 點我下載

方法二:透過 Git 命令下載

如果你比較習慣使用命令列,可以透過 Git 將倉庫克隆到自己的電腦。還沒安裝 Git 的話,建議就用第一種方法下載,不然也可以參考 README 上面的教學

安裝好 Git 之後,依照下面的順序執行命令安裝繁體中文版 Rustlings 庫:

  • 打開電腦的 終端機命令提示字元 並導航到你希望克隆倉庫的目錄。例如,如果你想要把倉庫克隆到桌面,可以運行:
cd ~/Desktop
  • 執行克隆命令:
git clone https://github.com/TimLai666/rustlings-zh-TW.git

安裝必要套件

下載完後,要安裝相關套件,才能讓 Rustlings 自動幫我們檢查作業。

  • 在下載好的資料夾中打開電腦的 終端機(mac)或 命令提示字元(Windows),執行下面的命令:
cargo install --git https://github.com/TimLai666/rustlings-zh-TW

我這裡直接使用 Visual Studio Code。

輸入命令然後按 Enter

等他跑完就裝好了。

開始練習 Rust!

Rust 和 Rustlings 都裝好之後,就可以開始練習啦!

  • 進入倉庫目錄:
cd rustlings-zh-TW
  • 運行 Rustlings 命令開始練習,例如:
rustlings watch

(其實還有很多不同的指令,大家有興趣的話可以看 GitHub 上的 README 自行研究,這裡就不贅述了)

這裡一樣直接使用 VS Code。

輸入命令並按下 Enter。

出現這個畫面就代表成功進入練習模式了!
可以打開 exercises 資料夾依序做裡面的練習題。

完成練習題後,只要把程式碼裡面的 // I AM NOT DONE 刪掉,Rustlings 就會自動檢查你有沒有做對。

坐而言不如起而行,我們馬上來看看第一個單元吧!

00_intro(介紹)

首先我們點開 00_intro 資料夾下的 README.md

# 介紹

Rust 使用 `print!` 和 `println!` 巨集來將文字輸出到控制台。
## 更多資訊

- [Hello World](https://doc.rust-lang.org/rust-by-example/hello.html)
- [格式化輸出](https://doc.rust-lang.org/rust-by-example/hello/print.html)

如果編輯器有安裝 Markdown 插件的話,可以打開預覽功能,看起來比較舒適。

這個單元的目標是要使用 print!println! 來輸出文字,聽起來非常簡單。

第一題(intro1.rs

// intro1.rs
//
// 關於這個 `I AM NOT DONE` 標註:
// 我們有時會鼓勵您在已經解決一個練習之後繼續嘗試,即使您已經找到了答案。
// 如果您已經完成了所有工作並且準備好進行下一個練習,請刪除下面的 `I AM NOT DONE` 註釋。
//
// 如果您正在使用 `rustlings watch` 運行這個文件: 每當您更改下面的一行代碼時,練習文件將會重新加載!
// 嘗試添加一行 `println!`,或者嘗試改變它在終端輸出的內容。
// 嘗試刪除一個分號,看看會發生什麼!
//
// 執行 `rustlings hint intro1` 或使用 `hint` watch 子命令來獲取提示。

// I AM NOT DONE

fn main() {
    println!("您好,");
    println!(r#"       歡迎來到...                      "#);
    println!(r#"                 _   _ _                  "#);
    println!(r#"  _ __ _   _ ___| |_| (_)_ __   __ _ ___  "#);
    println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
    println!(r#" | |  | |_| \__ \ |_| | | | | | (_| \__ \ "#);
    println!(r#" |_|   \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
    println!(r#"                               |___/      "#);
    println!();
    println!("此練習已成功編譯。其餘練習包含編譯或邏輯錯誤。Rustlings 的核心概念是修復這些錯誤並解決練習。祝您好運!");
    println!();
    println!("此練習的源碼在 `exercises/00_intro/intro1.rs`。請查看!");
    println!("之後,每個練習的源碼路徑將會顯示在成功或失敗的輸出結果中。");
    println!();
    println!(
        "如果您想使用 Rust 的 LSP 實現 rust-analyzer,請確保您的編輯器已設置,"
    );
    println!("然後在繼續之前運行 `rustlings lsp`。")
}

這個練習其實已經可以通過編譯了,但它要我們試著加一行 println! 然後刪除分號看看。

那我就在最後一行加個 hello world 好了。

進度: [------------------------------------------------------------] 0/96 (0.0 %)                                                                ! 編譯 exercises/00_intro/intro1.rs 失敗!請再試一次。以下是輸出:
error: expected `;`, found `println`
  --> exercises/00_intro/intro1.rs:33:43
   |
33 |     println!("然後在繼續之前運行 `rustlings lsp`。")
   |                                                     ^ help: add `;` here
34 |     println!("hello world!")
   |     ------- unexpected token

error: aborting due to 1 previous error

編譯失敗了,因為 println!("然後在繼續之前運行 `rustlings lsp`。") 這句少了一個分號。加個分號上去看看。

進度: [------------------------------------------------------------] 0/96 (0.0 %)                                                                ✓ 成功運行 exercises/00_intro/intro1.rs!

🎉 🎉 代碼正在編譯! 🎉 🎉

輸出:
====================
您好,
       歡迎來到...
                 _   _ _
  _ __ _   _ ___| |_| (_)_ __   __ _ ___  
 | '__| | | / __| __| | | '_ \ / _` / __| 
 | |  | |_| \__ \ |_| | | | | | (_| \__ \ 
 |_|   \__,_|___/\__|_|_|_| |_|\__, |___/
                               |___/

此練習已成功編譯。其餘練習包含編譯或邏輯錯誤。Rustlings 的核心概念是修復這些錯誤並解決練習。祝您好運!

此練習的源碼在 `exercises/00_intro/intro1.rs`。請查看!
之後,每個練習的源碼路徑將會顯示在成功或失敗的輸出結果中。

如果您想使用 Rust 的 LSP 實現 rust-analyzer,請確保您的編輯器已設置,
然後在繼續之前運行 `rustlings lsp`。
hello world!

====================

您可以繼續進行此練習,
或通過刪除 `I AM NOT DONE` 註釋來進入下一個練習:

11 |  // 執行 `rustlings hint intro1` 或使用 `hint` watch 子命令來獲取提示。
12 |
13 |  // I AM NOT DONE
14 |
15 |  fn main() {

編譯通過了,但我最後一個 println! 其實沒加分號,看來 Rust 函數中的最後一行或許可以不用加分號?

加個分號驗證看看。

// intro1.rs
//
// 關於這個 `I AM NOT DONE` 標註:
// 我們有時會鼓勵您在已經解決一個練習之後繼續嘗試,即使您已經找到了答案。
// 如果您已經完成了所有工作並且準備好進行下一個練習,請刪除下面的 `I AM NOT DONE` 註釋。
//
// 如果您正在使用 `rustlings watch` 運行這個文件: 每當您更改下面的一行代碼時,練習文件將會重新加載!
// 嘗試添加一行 `println!`,或者嘗試改變它在終端輸出的內容。
// 嘗試刪除一個分號,看看會發生什麼!
//
// 執行 `rustlings hint intro1` 或使用 `hint` watch 子命令來獲取提示。

// I AM NOT DONE

fn main() {
    println!("您好,");
    println!(r#"       歡迎來到...                      "#);
    println!(r#"                 _   _ _                  "#);
    println!(r#"  _ __ _   _ ___| |_| (_)_ __   __ _ ___  "#);
    println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
    println!(r#" | |  | |_| \__ \ |_| | | | | | (_| \__ \ "#);
    println!(r#" |_|   \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
    println!(r#"                               |___/      "#);
    println!();
    println!("此練習已成功編譯。其餘練習包含編譯或邏輯錯誤。Rustlings 的核心概念是修復這些錯誤並解決練習。祝您好運!");
    println!();
    println!("此練習的源碼在 `exercises/00_intro/intro1.rs`。請查看!");
    println!("之後,每個練習的源碼路徑將會顯示在成功或失敗的輸出結果中。");
    println!();
    println!(
        "如果您想使用 Rust 的 LSP 實現 rust-analyzer,請確保您的編輯器已設置,"
    );
    println!("然後在繼續之前運行 `rustlings lsp`。");
    println!("hello world!");
}
進度: [------------------------------------------------------------] 0/96 (0.0 %)                                                                ✓ 成功運行 exercises/00_intro/intro1.rs!

🎉 🎉 代碼正在編譯! 🎉 🎉

輸出:
====================
您好,
       歡迎來到...
                 _   _ _
  _ __ _   _ ___| |_| (_)_ __   __ _ ___  
 | '__| | | / __| __| | | '_ \ / _` / __| 
 | |  | |_| \__ \ |_| | | | | | (_| \__ \ 
 |_|   \__,_|___/\__|_|_|_| |_|\__, |___/ 
                               |___/      

此練習已成功編譯。其餘練習包含編譯或邏輯錯誤。Rustlings 的核心概念是修復這些錯誤並解決練習。祝您好運!

此練習的源碼在 `exercises/00_intro/intro1.rs`。請查看!
之後,每個練習的源碼路徑將會顯示在成功或失敗的輸出結果中。

如果您想使用 Rust 的 LSP 實現 rust-analyzer,請確保您的編輯器已設置,
然後在繼續之前運行 `rustlings lsp`。
hello world!

====================

您可以繼續進行此練習,
或通過刪除 `I AM NOT DONE` 註釋來進入下一個練習:

11 |  // 執行 `rustlings hint intro1` 或使用 `hint` watch 子命令來獲取提示。
12 |
13 |  // I AM NOT DONE
14 |
15 |  fn main() {

依然成功編譯。

第二題(intro2.rs

// intro2.rs
//
// 讓程式碼輸出一個問候世界的訊息。
//
// 執行 `rustlings hint intro2` 或使用 `hint` watch 子命令來獲取提示。

// I AM NOT DONE

fn main() {
    printline!("你好!")
}
進度: [------------------------------------------------------------] 0/96 (0.0 %)                                                                進度: [>-----------------------------------------------------------] 1/96 (1.0 %)                                                                ! 編譯 exercises/00_intro/intro2.rs 失敗!請再試一次。以下是輸出:
error: cannot find macro `printline` in this scope
  --> exercises/00_intro/intro2.rs:10:5
   |
10 |     printline!("你好!")
   |     ^^^^^^^^^ help: a macro with a similar name exists: `println`
  --> /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081\library\std\src\macros.rs:138:1
   |
   = note: similarly named macro `println` defined here

error: aborting due to 1 previous error

printline! 改成 println!

// intro2.rs
//
// 讓程式碼輸出一個問候世界的訊息。
//
// 執行 `rustlings hint intro2` 或使用 `hint` watch 子命令來獲取提示。

// I AM NOT DONE

fn main() {
    println!("你好!")
}
進度: [>-----------------------------------------------------------] 1/96 (1.0 %)                                                                ✓ 成功運行 exercises/00_intro/intro2.rs!

🎉 🎉 代碼正在編譯! 🎉 🎉

輸出:
====================
你好!

====================

您可以繼續進行此練習,
或通過刪除 `I AM NOT DONE` 註釋來進入下一個練習:

 5 |  // 執行 `rustlings hint intro2` 或使用 `hint` watch 子命令來獲取提示。
 6 |  
 7 |  // I AM NOT DONE
 8 |  
 9 |  fn main() {

通過~

總結

第 0 單元就這樣完成了!可說是毫無壓力~~

複習一下今天學到的:

  1. print!println! 來輸出文字(它們之間的差別應該是 println! 會換行,print! 不會)。
  2. 每一行程式碼結尾要加分號。
  3. 函數中的最後一行分號可加可不加。

那我們就下篇文章見囉!

p.s. 邊學邊寫文章實在有點累啊…

Similar Posts