在我上一篇關(guān)于 Rustup 的文章中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話下載工具鏈又有什么用?學(xué)習(xí)任何語言都包括閱讀現(xiàn)有的代碼和寫很多的示例程序,這是精通一門語言的好方法。然而,我們還可以走第三條路:調(diào)試代碼。
通過調(diào)試來學(xué)習(xí)牽扯到嘗試去編譯一個已經(jīng)寫好的(滿是漏洞的)示例程序,理解編譯器生成的錯誤信息,修復(fù)示例代碼,然后再重新編譯。重復(fù)這個過程直到代碼能夠成功被編譯并運(yùn)行。
Rustlings是一個由 Rust 團(tuán)隊(duì)維護(hù)的開源項(xiàng)目,旨在幫助你通過調(diào)試代碼來學(xué)習(xí) Rust。它也會一路為你提供提示。如果你是一名 Rust 初學(xué)者,并且剛開始閱讀或已經(jīng)讀完了 Rust 書籍,那么 Rustlings 就是理想的下一步。Rustllings 幫助你將運(yùn)用書中所學(xué),并轉(zhuǎn)向開發(fā)更大的項(xiàng)目。
安裝 Rustlings
我使用(并推薦)Fedora 電腦來體驗(yàn) Rustlings,但是任何 Linux 發(fā)行版都可以。要安裝 Rustlings,你必須下載并運(yùn)行它的安裝腳本。通常建議你以不具備任何特別權(quán)限的普通用戶(非 root 用戶)來運(yùn)行腳本。
記住,你需要 Rust 工具鏈來使用 Rustlings。如果你還沒有這些工具鏈,請參考我關(guān)于 Rustup 的文章。
當(dāng)你準(zhǔn)備好時,下載這個安裝腳本:
-
$ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh > rustlings_install.sh -
$ file rustlings_install.sh -
rustlings_install.sh: Bourne-Again shell script, ASCII text executable
閱讀腳本以了解它會做什么:
-
$ less rustlings_install.sh
然后運(yùn)行安裝:
-
$ bash rustlings_install.sh -
[...] -
Installing /home/tux/.cargo/bin/rustlings -
Installed package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`) -
All done!
運(yùn)行rustlings以開始。
Rustlings 練習(xí)
你現(xiàn)在可以使用命令rustlings。與標(biāo)志--help一起執(zhí)行來查看可選的選項(xiàng)。
-
$ rustlings --help
這個安裝腳本也克隆了 Rustlings 的 Git 倉庫,并安裝了運(yùn)行示例程序所需的依賴。你可以在ruslings下的exercises目錄查閱這些示例程序。
-
$ cd rustlings -
$ pwd -
/home/tux/rustlings -
$ ls -
AUTHORS.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
從命令行列出所有練習(xí)
命令ruslings提供給你一個list命令用以展示每個示例程序,它的完整路徑,以及狀態(tài) (默認(rèn)為 “待定”)。
-
$ rustlings list -
Name Path Status -
intro1 exercises/intro/intro1.rs Pending -
intro2 exercises/intro/intro2.rs Pending -
variables1 exercises/variables/variables1.rs Pending -
variables2 exercises/variables/variables2.rs Pending -
variables3 exercises/variables/variables3.rs Pending -
[...]
在顯示結(jié)尾處,你會有一個進(jìn)度報告用來追蹤進(jìn)度。
-
Progress: You completed 0 / 84 exercises (0.00 %).
查看示例程序
命令rustlings list向你展示了現(xiàn)有的程序,所以你可以在任何時候查看這些程序的代碼,你只需要將完整路徑復(fù)制到你的終端作為命令cat opensource.com或者less opensource.com的參數(shù):
-
$ cat exercises/intro/intro1.rs
驗(yàn)證你的程序
現(xiàn)在你可以開始調(diào)試程序了。你可以使用命令verify來做這件事。注意 Rustlings 選擇了列表里的第一個程序(intro1.rs)并嘗試去編譯它,最后編譯成功:
-
$ rustlings verify -
Progress: [-----------------------------------] 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 |
正如你從結(jié)果中所見,盡管示例代碼成功編譯了,你依然需要做一些工作。每個示例程序的源文件中都帶有以下注釋:
-
$ grep "NOT DONE" exercises/intro/intro1.rs -
// I AM NOT DONE
雖然第一個程序的編譯沒有問題,除非你去掉注釋I AM NOT DONE,Rustlings 不會移到下一個程序。
來到下一個練習(xí)
一旦你從intro1.rs中去掉這些注釋,你就可以通過再一次運(yùn)行命令rustlings verify來到下一個練習(xí)。這一次,你會發(fā)現(xiàn) Rustlings 嘗試去編譯這個系列中的下一個程序(intro2.rs),但是遇到了一個錯誤。你應(yīng)該調(diào)試并修復(fù)這個問題,并前進(jìn)。這是你理解為什么 Rust 說程序有漏洞的至關(guān)重要的一步。
-
$ rustlings verify -
Progress: [>------------------------] 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.rs21 -
| -
8 | println!("Hello {}!"); -
| ^^ -
error: aborting due to previous error
來點(diǎn)提示
Rustlings 有一個非常好用的hint參數(shù),這個參數(shù)會告訴你示例程序中哪里出錯了,以及如何去修復(fù)它。你可以認(rèn)為這是在編譯錯誤信息基礎(chǔ)之上,一個額外的幫助選項(xiàng)。
-
$ rustlings hint intro2 -
Add an argument after the format string.
基于以上提示,修復(fù)這個程序就很簡單了。你只需要在語句println中加一個額外的參數(shù)。這個 diff 對比應(yīng)該能幫你理解發(fā)生的變化:
-
< println!("Hello {}!", "world"); -
--- -
> println!("Hello {}!");
一旦你做出了修改,并從源代碼中去掉了注釋NOT DONE,你可以再一次運(yùn)行rustlings verify來編譯并運(yùn)行代碼。
-
$ rustlings verify -
Progress: [>-------------------------------------] 1/84 -
Successfully ran exercises/intro/intro2.rs!
追蹤進(jìn)度
你無法在一天之內(nèi)做完所有的練習(xí),忘記練到哪也很常見。你可以執(zhí)行命令list來查看你的練習(xí)狀態(tài)。
-
$ rustlings list -
Name Path Status -
intro1 exercises/intro/intro1.rs Done -
intro2 exercises/intro/intro2.rs Done -
variables1 exercises/variables/variables1.rs Pending -
variables2 exercises/variables/variables2.rs Pending -
variables3 exercises/variables/variables3.rs Pending -
[...]
運(yùn)行特定的練習(xí)
如果你不想從頭開始并且想要跳過一些練習(xí),Rustlings 允許你使用命令rustlings run來專注特定的練習(xí)。如此可以運(yùn)行指定的程序而不需要驗(yàn)證之前的課程。例如:
-
$ rustlings run intro2 -
Hello world! -
Successfully ran exercises/intro/intro2.rs -
$ rustlings run variables1
敲入練習(xí)名字可能會變得乏味,但 Rustlings 為你準(zhǔn)備了便利的命令next用來移向系列中的下一個練習(xí)。
-
$ rustlings run next
替代命令 watch
如果你不想在每次修改后還要敲一次verify,你可以在終端窗口中運(yùn)行命令watch,然后再繼續(xù)修改源代碼以解決問題。命令watch會檢測到這些修改,然后重新編譯以查看這些問題是否被解決。
-
$ rustlings watch
通過調(diào)試學(xué)習(xí)
Rust 編譯器以提供非常有意義的錯誤信息而被熟知,這些錯誤信息會幫助你理解在你代碼中的問題。這通常意味著更快的調(diào)試。Rustlings 是練習(xí) Rust,學(xué)會閱讀錯誤信息,并理解 Rust 語言的優(yōu)秀途徑。來看看GitHub上 Rustlings 5.0.0 的最新功能吧。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
88文章
11622瀏覽量
217824 -
調(diào)試
+關(guān)注
關(guān)注
7文章
623瀏覽量
35371 -
代碼
+關(guān)注
關(guān)注
30文章
4940瀏覽量
73074 -
Rust
+關(guān)注
關(guān)注
1文章
240瀏覽量
7464
原文標(biāo)題:以調(diào)試 Rust 的方式來學(xué)習(xí) Rust | Linux 中國
文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何使用Rust連接Redis
Rust GUI實(shí)踐之Rust-Qt模塊
Rust的多線程編程概念和使用方法
只會用Python?教你在樹莓派上開始使用Rust
怎樣去使用Rust進(jìn)行嵌入式編程呢
在Rust代碼中加載靜態(tài)庫時,出現(xiàn)錯誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?
使用rustup來管理所有和Rust相關(guān)的工具鏈
Chromium正式開始支持Rust
Rust中的錯誤處理方法
Rust 1.68.1發(fā)布修復(fù)了回歸問題
rust語言基礎(chǔ)學(xué)習(xí): 智能指針之Cow
rust語言基礎(chǔ)學(xué)習(xí): rust中的錯誤處理
Rust的內(nèi)部工作原理
谷歌程序員認(rèn)為學(xué)習(xí)Rust很easy

以調(diào)試Rust的方式來學(xué)習(xí)Rust
評論