
在我上一篇 ??關于 Rustup 的文章?? 中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話下載工具鏈又有什么用?學習任何語言都包括閱讀現有的代碼和寫很多的示例程序,這是精通一門語言的好方法。然而,我們還可以走第三條路:調試代碼。
通過調試來學習牽扯到嘗試去編譯一個已經寫好的(滿是漏洞的)示例程序,理解編譯器生成的錯誤信息,修復示例代碼,然后再重新編譯。重復這個過程直到代碼能夠成功被編譯并運行。
??Rustlings?? 是一個由
Rust 團隊維護的開源項目,旨在幫助你通過調試代碼來學習 Rust。它也會一路為你提供提示。如果你是一名 Rust
初學者,并且剛開始閱讀或已經讀完了 Rust 書籍,那么 Rustlings 就是理想的下一步。Rustllings
幫助你將運用書中所學,并轉向開發更大的項目。
安裝 Rustlings
我使用(并推薦)Fedora 電腦來體驗 Rustlings,但是任何 Linux 發行版都可以。要安裝 Rustlings,你必須下載并運行它的安裝腳本。通常建議你以不具備任何特別權限的普通用戶(非 root 用戶)來運行腳本。
記住,你需要 Rust 工具鏈來使用 Rustlings。如果你還沒有這些工具鏈,請參考我 ??關于 Rustup 的文章??。
當你準備好時,下載這個安裝腳本:
$ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh > rustlings_install.sh$ file rustlings_install.shrustlings_install.sh: Bourne-Again shell script, ASCII text executable
閱讀腳本以了解它會做什么:
$ less rustlings_install.sh
然后運行安裝:
$ bash rustlings_install.sh[...]Installing /home/tux/.cargo/bin/rustlingsInstalled package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`)All done!
運行 ??rustlings?
? 以開始。
Rustlings 練習
你現在可以使用命令 ??rustlings?
?。與標志 ??--help?
? 一起執行來查看可選的選項。
這個安裝腳本也克隆了 Rustlings 的 Git 倉庫,并安裝了運行示例程序所需的依賴。你可以在 ??ruslings?
? 下的 ??exercises?
? 目錄查閱這些示例程序。
$ cd rustlings$ pwd/home/tux/rustlings$ lsAUTHORS.md Cargo.toml CONTRIBUTING.md info.toml install.sh README.md target Cargo.lock CHANGELOG.md exercises install.ps1 LICENSE src tests$ ls -m exercises/advanced_errors, clippy, collections, conversions, enums, error_handling, functions, generics, if, intro, macros, mod.rs, modules, move_semantics, option, primitive_types, quiz1.rs, quiz2.rs, quiz3.rs, quiz4.rs, README.md, standard_library_types, strings, structs, tests, threads, traits, variables
從命令行列出所有練習
命令 ??ruslings?
? 提供給你一個 ??list?
? 命令用以展示每個示例程序,它的完整路徑,以及狀態 (默認為 “待定”)。
$ rustlings listName Path Statusintro1 exercises/intro/intro1.rs Pendingintro2 exercises/intro/intro2.rs Pendingvariables1 exercises/variables/variables1.rs Pendingvariables2 exercises/variables/variables2.rs Pendingvariables3 exercises/variables/variables3.rs Pending[...]
在顯示結尾處,你會有一個進度報告用來追蹤進度。
Progress: You completed 0 / 84 exercises (0.00 %).
查看示例程序
命令 ??rustlings list?
? 向你展示了現有的程序,所以你可以在任何時候查看這些程序的代碼,你只需要將完整路徑復制到你的終端作為命令 ??cat?? 或者 ??less?? 的參數:
$ cat exercises/intro/intro1.rs
驗證你的程序
現在你可以開始調試程序了。你可以使用命令 ??verify?
? 來做這件事。注意 Rustlings 選擇了列表里的第一個程序(??intro1.rs?
?)并嘗試去編譯它,最后編譯成功:
$ rustlings verifyProgress: [-----------------------------------] 0/84? Successfully ran exercises/intro/intro1.rs!You can keep working on this exercise,or jump into the next one by removing the `I AM NOT DONE` comment: 6 | // Execute the command `rustlings hint intro1` for a hint. 7 | 8 | // I AM NOT DONE 9 |
正如你從結果中所見,盡管示例代碼成功編譯了,你依然需要做一些工作。每個示例程序的源文件中都帶有以下注釋:
$ grep "NOT DONE" exercises/intro/intro1.rs// I AM NOT DONE
雖然第一個程序的編譯沒有問題,除非你去掉注釋 ??I AM NOT DONE?
?,Rustlings 不會移到下一個程序。
來到下一個練習
一旦你從 ??intro1.rs?
? 中去掉這些注釋,你就可以通過再一次運行命令 ??rustlings verify?
? 來到下一個練習。這一次,你會發現 Rustlings 嘗試去編譯這個系列中的下一個程序(??intro2.rs?
?),但是遇到了一個錯誤。你應該調試并修復這個問題,并前進。這是你理解為什么 Rust 說程序有漏洞的至關重要的一步。
$ rustlings verifyProgress: [>------------------------] 1/84?? Compiling of exercises/intro/intro2.rs failed! Please try again. Here's the output:error: 1 positional argument in format string, but no arguments were given --> exercises/intro/intro2.rs:8:21 |8 | println!("Hello {}!"); | ^^error: aborting due to previous error
來點提示
Rustlings 有一個非常好用的 ??hint?
? 參數,這個參數會告訴你示例程序中哪里出錯了,以及如何去修復它。你可以認為這是在編譯錯誤信息基礎之上,一個額外的幫助選項。
$ rustlings hint intro2Add an argument after the format string.
基于以上提示,修復這個程序就很簡單了。你只需要在語句 ??println?
? 中加一個額外的參數。這個 diff 對比應該能幫你理解發生的變化:
< println!("Hello {}!", "world");---> println!("Hello {}!");
一旦你做出了修改,并從源代碼中去掉了注釋 ??NOT DONE?
?,你可以再一次運行 ??rustlings verify?
? 來編譯并運行代碼。
$ rustlings verifyProgress: [>-------------------------------------] 1/84? Successfully ran exercises/intro/intro2.rs!
追蹤進度
你無法在一天之內做完所有的練習,忘記練到哪也很常見。你可以執行命令 ??list?
? 來查看你的練習狀態。
$ rustlings listName Path Statusintro1 exercises/intro/intro1.rs Done intro2 exercises/intro/intro2.rs Done variables1 exercises/variables/variables1.rs Pendingvariables2 exercises/variables/variables2.rs Pendingvariables3 exercises/variables/variables3.rs Pending[...]
運行特定的練習
如果你不想從頭開始并且想要跳過一些練習,Rustlings 允許你使用命令 ??rustlings run?
? 來專注特定的練習。如此可以運行指定的程序而不需要驗證之前的課程。例如:
$ rustlings run intro2Hello world!? Successfully ran exercises/intro/intro2.rs$ rustlings run variables1
敲入練習名字可能會變得乏味,但 Rustlings 為你準備了便利的命令 ??next?
? 用來移向系列中的下一個練習。
替代命令 watch
如果你不想在每次修改后還要敲一次 ??verify?
?,你可以在終端窗口中運行命令 ??watch?
?,然后再繼續修改源代碼以解決問題。命令 ??watch?
? 會檢測到這些修改,然后重新編譯以查看這些問題是否被解決。
通過調試學習
Rust 編譯器以提供非常有意義的錯誤信息而被熟知,這些錯誤信息會幫助你理解在你代碼中的問題。這通常意味著更快的調試。Rustlings 是練習 Rust,學會閱讀錯誤信息,并理解 Rust 語言的優秀途徑。來看看 ??GitHub?? 上 Rustlings 5.0.0 的最新功能吧。
??下載 Rust 速查表??