繼上一篇認識了 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 單元就這樣完成了!可說是毫無壓力~~
複習一下今天學到的:
- 用
print!
或println!
來輸出文字(它們之間的差別應該是println!
會換行,print!
不會)。 - 每一行程式碼結尾要加分號。
- 函數中的最後一行分號可加可不加。
那我們就下篇文章見囉!
p.s. 邊學邊寫文章實在有點累啊…
7 Comments