以調(diào)試 Rust 的方式來(lái)學(xué)習(xí) Rust

在我上一篇 ??關(guān)于 Rustup 的文章?? 中,我向你們展示了如何安裝 Rust 工具鏈。但是,如果不能上手操作一下 Rust 的話(huà)下載工具鏈又有什么用?學(xué)習(xí)任何語(yǔ)言都包括閱讀現(xiàn)有的代碼和寫(xiě)很多的示例程序,這是精通一門(mén)語(yǔ)言的好方法。然而,我們還可以走第三條路:調(diào)試代碼。
通過(guò)調(diào)試來(lái)學(xué)習(xí)牽扯到嘗試去編譯一個(gè)已經(jīng)寫(xiě)好的(滿(mǎn)是漏洞的)示例程序,理解編譯器生成的錯(cuò)誤信息,修復(fù)示例代碼,然后再重新編譯。重復(fù)這個(gè)過(guò)程直到代碼能夠成功被編譯并運(yùn)行。
??Rustlings?? 是一個(gè)由 Rust 團(tuán)隊(duì)維護(hù)的開(kāi)源項(xiàng)目,旨在幫助你通過(guò)調(diào)試代碼來(lái)學(xué)習(xí) Rust。它也會(huì)一路為你提供提示。如果你是一名 Rust 初學(xué)者,并且剛開(kāi)始閱讀或已經(jīng)讀完了 Rust 書(shū)籍,那么 Rustlings 就是理想的下一步。Rustllings 幫助你將運(yùn)用書(shū)中所學(xué),并轉(zhuǎn)向開(kāi)發(fā)更大的項(xiàng)目。
安裝 Rustlings
我使用(并推薦)Fedora 電腦來(lái)體驗(yàn) Rustlings,但是任何 Linux 發(fā)行版都可以。要安裝 Rustlings,你必須下載并運(yùn)行它的安裝腳本。通常建議你以不具備任何特別權(quán)限的普通用戶(hù)(非 root 用戶(hù))來(lái)運(yùn)行腳本。
記住,你需要 Rust 工具鏈來(lái)使用 Rustlings。如果你還沒(méi)有這些工具鏈,請(qǐng)參考我 ??關(guān)于 Rustup 的文章??。
當(dāng)你準(zhǔn)備好時(shí),下載這個(gè)安裝腳本:
閱讀腳本以了解它會(huì)做什么:
然后運(yùn)行安裝:
運(yùn)行 ??rustlings?? 以開(kāi)始。
Rustlings 練習(xí)
你現(xiàn)在可以使用命令 ??rustlings??。與標(biāo)志 ??--help?? 一起執(zhí)行來(lái)查看可選的選項(xiàng)。
這個(gè)安裝腳本也克隆了 Rustlings 的 Git 倉(cāng)庫(kù),并安裝了運(yùn)行示例程序所需的依賴(lài)。你可以在 ??ruslings?? 下的 ??exercises?? 目錄查閱這些示例程序。
從命令行列出所有練習(xí)
命令 ??ruslings?? 提供給你一個(gè) ??list?? 命令用以展示每個(gè)示例程序,它的完整路徑,以及狀態(tài) (默認(rèn)為 “待定”)。
在顯示結(jié)尾處,你會(huì)有一個(gè)進(jìn)度報(bào)告用來(lái)追蹤進(jìn)度。
查看示例程序
命令 ??rustlings list?? 向你展示了現(xiàn)有的程序,所以你可以在任何時(shí)候查看這些程序的代碼,你只需要將完整路徑復(fù)制到你的終端作為命令 ??cat?? 或者 ??less?? 的參數(shù):
驗(yàn)證你的程序
現(xiàn)在你可以開(kāi)始調(diào)試程序了。你可以使用命令 ??verify?? 來(lái)做這件事。注意 Rustlings 選擇了列表里的第一個(gè)程序(??intro1.rs??)并嘗試去編譯它,最后編譯成功:
正如你從結(jié)果中所見(jiàn),盡管示例代碼成功編譯了,你依然需要做一些工作。每個(gè)示例程序的源文件中都帶有以下注釋?zhuān)?/p>
雖然第一個(gè)程序的編譯沒(méi)有問(wèn)題,除非你去掉注釋 ??I AM NOT DONE??,Rustlings 不會(huì)移到下一個(gè)程序。
來(lái)到下一個(gè)練習(xí)
一旦你從 ??intro1.rs?? 中去掉這些注釋?zhuān)憔涂梢酝ㄟ^(guò)再一次運(yùn)行命令 ??rustlings verify?? 來(lái)到下一個(gè)練習(xí)。這一次,你會(huì)發(fā)現(xiàn) Rustlings 嘗試去編譯這個(gè)系列中的下一個(gè)程序(??intro2.rs??),但是遇到了一個(gè)錯(cuò)誤。你應(yīng)該調(diào)試并修復(fù)這個(gè)問(wèn)題,并前進(jìn)。這是你理解為什么 Rust 說(shuō)程序有漏洞的至關(guān)重要的一步。
來(lái)點(diǎn)提示
Rustlings 有一個(gè)非常好用的 ??hint?? 參數(shù),這個(gè)參數(shù)會(huì)告訴你示例程序中哪里出錯(cuò)了,以及如何去修復(fù)它。你可以認(rèn)為這是在編譯錯(cuò)誤信息基礎(chǔ)之上,一個(gè)額外的幫助選項(xiàng)。
基于以上提示,修復(fù)這個(gè)程序就很簡(jiǎn)單了。你只需要在語(yǔ)句 ??println?? 中加一個(gè)額外的參數(shù)。這個(gè) diff 對(duì)比應(yīng)該能幫你理解發(fā)生的變化:
一旦你做出了修改,并從源代碼中去掉了注釋 ??NOT DONE??,你可以再一次運(yùn)行 ??rustlings verify?? 來(lái)編譯并運(yùn)行代碼。
追蹤進(jìn)度
你無(wú)法在一天之內(nèi)做完所有的練習(xí),忘記練到哪也很常見(jiàn)。你可以執(zhí)行命令 ??list?? 來(lái)查看你的練習(xí)狀態(tài)。
運(yùn)行特定的練習(xí)
如果你不想從頭開(kāi)始并且想要跳過(guò)一些練習(xí),Rustlings 允許你使用命令 ??rustlings run?? 來(lái)專(zhuān)注特定的練習(xí)。如此可以運(yùn)行指定的程序而不需要驗(yàn)證之前的課程。例如:
敲入練習(xí)名字可能會(huì)變得乏味,但 Rustlings 為你準(zhǔn)備了便利的命令 ??next?? 用來(lái)移向系列中的下一個(gè)練習(xí)。
替代命令 watch
如果你不想在每次修改后還要敲一次 ??verify??,你可以在終端窗口中運(yùn)行命令 ??watch??,然后再繼續(xù)修改源代碼以解決問(wèn)題。命令 ??watch?? 會(huì)檢測(cè)到這些修改,然后重新編譯以查看這些問(wèn)題是否被解決。
通過(guò)調(diào)試學(xué)習(xí)
Rust 編譯器以提供非常有意義的錯(cuò)誤信息而被熟知,這些錯(cuò)誤信息會(huì)幫助你理解在你代碼中的問(wèn)題。這通常意味著更快的調(diào)試。Rustlings 是練習(xí) Rust,學(xué)會(huì)閱讀錯(cuò)誤信息,并理解 Rust 語(yǔ)言的優(yōu)秀途徑。來(lái)看看 ??GitHub?? 上 Rustlings 5.0.0 的最新功能吧。






































