我決定是時候學習Rust 了,為了保持自己的動力,我將在這裡記錄學習的進展。

費里斯螃蟹

有關於我的一些;我是一名 Web 開發人員,雖然已經涉足多年,但已經從事了大約 5 年。我有使用PerlPHP的經驗,但我的日常工作是 JavaScript/TypeScript,無論是透過NodeJS還是ReactJS 。我想學習 Rust 沒有什麼特別的原因,只是學習新事物很有趣。

我的第一個停靠點是Google learn rust ,這引導我找到了「這本書」 。這本書是 Rust 社群為新手(或所謂的 Rustlings)編寫的入門指南,旨在「紮實掌握這門語言」。

公共學習

我選擇公開記錄我的 Rust 學習之旅,因為我相信公開學習的力量。透過分享我的成功、挑戰和見解,我將加強自己的理解,並希望為其他走類似道路的人提供資源。

我親眼目睹了這種方法的價值。我邀請讀者提供回饋、更正和貢獻。雖然我認識到公共學習並不適合所有人,但我個人發現它非常有益,並希望激勵其他人考慮它。那麼,讓我們深入學習這些課程。

第 1 課“入門”

本課分為 3 個部分:

  • 安裝

  • 你好世界!

  • 你好,貨物!

安裝

看到列出的安裝,我鬆了口氣,我擔心我必須查找如何安裝 Rust。我使用的是 Windows 計算機,但決定在 Linux 中學習 Rust,因此我將透過 WSL 使用 Ubuntu。

安裝指令看起來很簡單,它使用curl來下載一些東西,然後透過sh進行管道傳輸,所以我們可以假設下載的專案是某種bash腳本。

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

不管你信不信,這是我犯下的第一個錯誤。我看到Rust is installed now. Great!訊息並繼續下一課。如果我繼續閱讀下去,我會發現我需要單獨安裝編譯器。

Linux 使用者通常應該根據其發行版的文件安裝 GCC 或 Clang。例如,如果您使用 Ubuntu,則可以安裝 build-essential 套件。

不過,這很容易解決,我很快就回到了正軌。

sudo apt install build-essential

你好世界!

下一部分是開發社群的主要內容,即深受喜愛的“Hello, World!”例子。

你好世界

我在這裡學到了一些東西,函數是用fn關鍵字聲明的,任何 Rust 應用程式的入口點都是main.rs檔案中的main函數,標準命名約定是使用下劃線來分隔函數和檔案名稱中的單字。

正是在這個階段,我發現我沒有安裝編譯器,我認為這是像這樣的簡單部分的真正原因,以確保我們都設定正確。

你好,貨物!

上一節很簡單,這節也很簡單,但向我們介紹了Cargo ,它是 Rust 的套件管理器,作為一個 JS 開發者,我的腦海裡直接想到了 NPM。

Cargo 允許我們做一些很酷的事情:

  • 為我們的包命名。

  • 新增包依賴項。

  • 用一個命令執行我們的程式。

  • 使用除錯模式和發布模式來建立我們的程式。

  • 檢查我們的程式是否編譯,但沒有實際建立它。

這個範例讓我們重新創造我們的Hello, World!例如但以貨運方式。程式碼非常簡單,幾乎不值得展示,但它就是這樣。

fn main() {
    println!("Hello, world!");
}

第 2 課“猜謎遊戲”

第二課沒有任何小節,本課的目標是編寫一個猜謎遊戲,用戶輸入一個數字,我們將其與隨機選擇的數字進行比較,遊戲繼續,直到用戶猜出確切的數字。

我們仍然沒有做任何突破性的事情,但從列印靜態文字到動態獲取用戶輸入並返回結果的進展仍然很好。

VS程式碼

正是在這一點上,我決定在nano中進行程式碼變更不是一個好主意,我需要在 VSCode 中開啟專案。我加入了一些擴展,希望能讓開發變得更容易。這些是rust-analyzer板條箱Even Better TOML 。你可以使用任何你喜歡的編輯器,我只是習慣了 VSCode。

VSCode 標誌

製作遊戲

讓我們來看看遊戲教程,它讓我們使用貨物來設定專案,並很快向我們介紹了一些新概念

  • use關鍵字。

  • 可變變數。

  • 錯誤處理。

  • 文件位置

use關鍵字

use關鍵字允許我們從其他庫中提取程式碼,作為一名 Web 開發人員,我想將其與import進行比較。預設情況下,Rust 將能夠存取「標準」庫中的一組專案,這稱為前奏,但如果您想存取其他任何內容,則必須使用use

在他們給出的範例中,我們確實use std::io;它允許我們存取io命名空間,這確實感覺有點奇怪,因為我們已經可以存取std ,這意味著std::io也可以存取。

可變變數

在 JavaScript 領域,我們有不可變變數和可變變數的概念,它們是constlet ,其中const是不可變的,而let不是。 Rust 有點不同,因為除非另有說明,否則所有變數都是不可變的,變數關鍵字也總是let ,或者至少據我所知到目前為止是這樣。

let mut var1 = String::new(); // mutable
let mut var2 = String::from("Test String"); // mutable
let var3 = 6; // immutable

這本書讓我們知道,第三課將回歸可變性。

錯誤處理

我們介紹了兩種類型的錯誤處理.expect ,它們不會嘗試任何類型的恢復,但會在應用程式崩潰和match時發布一條訊息。

Match從函數中取得Result ,然後允許您根據Result呼叫函數。在範例中,我們給出了parse並告訴它要么是Ok要么是Err ,在match中我們可以定義一個在這兩種情況下呼叫的函數。我假設當我們開始處理更多樣化的函數時,match 將能夠處理所有Result類型。

文件位置

這是迄今為止我最喜歡 Rust 的部分,我知道它不應該那麼令人興奮,但我認為它是。當您執行命令cargo doc Cargo 時,Cargo 將掃描您正在使用的所有程式碼,並產生解釋功能以及如何使用它們的說明頁面。

目前還沒有太多解釋,但我希望這些文件是從程式碼中的註解產生的,即使這不是那種情況,可以自我記錄的程式碼庫對我來說是如此有趣。

偏離了人跡罕至的地方

此時,我已經完成了前兩課,並決定對猜謎遊戲進行一些更改。我將遊戲循環提取到它自己的函數中,並加入了解析失敗的錯誤訊息。

我不喜歡的一件事是這條線的magic

let guess: u32 = match guess.trim().parse()

我不喜歡這種感覺,就像 parse 神奇地知道它的目標類型一樣。所以我閱讀了 VSCode 中的解析工具提示,它教導了有關turbofish語法的內容。我不知道人們是否不喜歡這種語法,或者這本書的作者是否認為它對於初學者來說太複雜,但在我看來,它更有意義。我們告訴 parse 我們想要什麼類型,然後我們的let從中推論出類型,而不是相反。

let guess = match guess.trim().parse::<u32>()

這是修改後的程式碼。

{% 嵌入 https://replit.com/@andrewb05/Guessing-game %}

註銷

感謝您與我一起踏上這段旅程。我計劃繼續這個系列並涵蓋整本書。如果您想關注,可以按下「關注」按鈕以獲得新帖子的通知。

正如我之前所說,請隨意留下任何反饋,如果您也在公開學習,請在評論中留下您的系列的連結,以便我可以查看。

非常感謝您的閱讀。如果您想在開發之外與我聯繫,這裡有我的Twitterlinkedin,歡迎來打個招呼 😊。


原文出處:https://dev.to/link2twenty/learning-rust-a-clean-start-4eom


共有 0 則留言