我決定是時候學習Rust 了,為了保持自己的動力,我將在這裡記錄學習的進展。
有關於我的一些;我是一名 Web 開發人員,雖然已經涉足多年,但已經從事了大約 5 年。我有使用Perl和PHP的經驗,但我的日常工作是 JavaScript/TypeScript,無論是透過NodeJS還是ReactJS 。我想學習 Rust 沒有什麼特別的原因,只是學習新事物很有趣。
我的第一個停靠點是Google learn rust
,這引導我找到了「這本書」 。這本書是 Rust 社群為新手(或所謂的 Rustlings)編寫的入門指南,旨在「紮實掌握這門語言」。
我選擇公開記錄我的 Rust 學習之旅,因為我相信公開學習的力量。透過分享我的成功、挑戰和見解,我將加強自己的理解,並希望為其他走類似道路的人提供資源。
我親眼目睹了這種方法的價值。我邀請讀者提供回饋、更正和貢獻。雖然我認識到公共學習並不適合所有人,但我個人發現它非常有益,並希望激勵其他人考慮它。那麼,讓我們深入學習這些課程。
本課分為 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!");
}
第二課沒有任何小節,本課的目標是編寫一個猜謎遊戲,用戶輸入一個數字,我們將其與隨機選擇的數字進行比較,遊戲繼續,直到用戶猜出確切的數字。
我們仍然沒有做任何突破性的事情,但從列印靜態文字到動態獲取用戶輸入並返回結果的進展仍然很好。
正是在這一點上,我決定在nano
中進行程式碼變更不是一個好主意,我需要在 VSCode 中開啟專案。我加入了一些擴展,希望能讓開發變得更容易。這些是rust-analyzer 、板條箱和Even Better TOML 。你可以使用任何你喜歡的編輯器,我只是習慣了 VSCode。
讓我們來看看遊戲教程,它讓我們使用貨物來設定專案,並很快向我們介紹了一些新概念
use
關鍵字。
可變變數。
錯誤處理。
文件位置
use
關鍵字use
關鍵字允許我們從其他庫中提取程式碼,作為一名 Web 開發人員,我想將其與import進行比較。預設情況下,Rust 將能夠存取「標準」庫中的一組專案,這稱為前奏,但如果您想存取其他任何內容,則必須使用use
。
在他們給出的範例中,我們確實use std::io;
它允許我們存取io
命名空間,這確實感覺有點奇怪,因為我們已經可以存取std
,這意味著std::io
也可以存取。
在 JavaScript 領域,我們有不可變變數和可變變數的概念,它們是const
和let
,其中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 %}
感謝您與我一起踏上這段旅程。我計劃繼續這個系列並涵蓋整本書。如果您想關注,可以按下「關注」按鈕以獲得新帖子的通知。
正如我之前所說,請隨意留下任何反饋,如果您也在公開學習,請在評論中留下您的系列的連結,以便我可以查看。
非常感謝您的閱讀。如果您想在開發之外與我聯繫,這裡有我的Twitter和linkedin,歡迎來打個招呼 😊。
原文出處:https://dev.to/link2twenty/learning-rust-a-clean-start-4eom