Linux中國

以調試 Rust 的方式來學習 Rust

在我上一篇 關於 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.sh
rustlings_install.sh: Bourne-Again shell script, ASCII text executable

閱讀腳本以了解它會做什麼:

$ less rustlings_install.sh

然後運行安裝:

$ bash rustlings_install.sh
[...]
Installing /home/tux/.cargo/bin/rustlings
Installed package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`)
All done!

運行 rustlings 以開始。

Rustlings 練習

你現在可以使用命令 rustlings。與標誌 --help 一起執行來查看可選的選項。

$ rustlings --help

這個安裝腳本也克隆了 Rustlings 的 Git 倉庫,並安裝了運行示常式序所需的依賴。你可以在 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

從命令行列出所有練習

命令 ruslings 提供給你一個 list 命令用以展示每個示常式序,它的完整路徑,以及狀態 (默認為 「待定」)。

$ 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
[...]

在顯示結尾處,你會有一個進度報告用來追蹤進度。

Progress: You completed 0 / 84 exercises (0.00 %).

查看示常式序

命令 rustlings list 向你展示了現有的程序,所以你可以在任何時候查看這些程序的代碼,你只需要將完整路徑複製到你的終端作為命令 cat 或者 less 的參數:

$ cat exercises/intro/intro1.rs

驗證你的程序

現在你可以開始調試程序了。你可以使用命令 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 |

正如你從結果中所見,儘管示例代碼成功編譯了,你依然需要做一些工作。每個示常式序的源文件中都帶有以下注釋:

$ 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 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.rs:8:21
  |
8 |         println!("Hello {}!");
  |                         ^^

error: aborting due to previous error

來點提示

Rustlings 有一個非常好用的 hint 參數,這個參數會告訴你示常式序中哪裡出錯了,以及如何去修復它。你可以認為這是在編譯錯誤信息基礎之上,一個額外的幫助選項。

$ rustlings hint intro2
Add an argument after the format string.

基於以上提示,修復這個程序就很簡單了。你只需要在語句 println 中加一個額外的參數。這個 diff 對比應該能幫你理解發生的變化:

< println!("Hello {}!", "world");
> println!("Hello {}!");

一旦你做出了修改,並從源代碼中去掉了注釋 NOT DONE,你可以再一次運行 rustlings verify 來編譯並運行代碼。

$ rustlings verify
Progress: [>-------------------------------------] 1/84
✅ Successfully ran exercises/intro/intro2.rs!

追蹤進度

你無法在一天之內做完所有的練習,忘記練到哪也很常見。你可以執行命令 list 來查看你的練習狀態。

$ 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
[...]

運行特定的練習

如果你不想從頭開始並且想要跳過一些練習,Rustlings 允許你使用命令 rustlings run 來專註特定的練習。如此可以運行指定的程序而不需要驗證之前的課程。例如:

$ rustlings run intro2
Hello world!
✅ Successfully ran exercises/intro/intro2.rs
$ rustlings run variables1

敲入練習名字可能會變得乏味,但 Rustlings 為你準備了便利的命令 next 用來移向系列中的下一個練習。

$ rustlings run next

替代命令 watch

如果你不想在每次修改後還要敲一次 verify,你可以在終端窗口中運行命令 watch,然後再繼續修改源代碼以解決問題。命令 watch 會檢測到這些修改,然後重新編譯以查看這些問題是否被解決。

$ rustlings watch

通過調試學習

Rust 編譯器以提供非常有意義的錯誤信息而被熟知,這些錯誤信息會幫助你理解在你代碼中的問題。這通常意味著更快的調試。Rustlings 是練習 Rust,學會閱讀錯誤信息,並理解 Rust 語言的優秀途徑。來看看 GitHub 上 Rustlings 5.0.0 的最新功能吧。

下載 Rust 速查表

via: https://opensource.com/article/22/7/learn-rust-rustlings

作者:Gaurav Kamathe 選題:lkxed 譯者:yzuowei 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國