通過編寫一個簡單的遊戲來學習 Rust | Linux 中國

2021-02-26 Linux中國

當你想學習一門新的程式語言時,不妨關注一下程式語言的共同點。

這些概念是大多數程式語言的基礎。一旦你理解了它們,你就可以開始弄清楚其餘的東西。

因為程式語言通常具有相似性,一旦你懂了一種語言,你就可以通過理解其差異來學習另一種語言的基礎知識。

學習新語言的一個好方法是使用一個你可以用來練習的標準程序。這可以讓你專注於語言,而不是程序的邏輯。我在這一系列文章中使用了一個「猜數字」的程序,在這個程序中,電腦會在 1 到 100 之間選一個數字讓你猜。程序一直循環,直到你猜對數字為止。

這個程序鍛鍊了程式語言的幾個概念:

這是學習一門新程式語言的很好的實踐實驗。

安裝 Rust

你可以使用 Rustup 安裝一個 Rust 工具鏈,或者你可以在線嘗試 Rust 而不在本地安裝它。

如果你在本地安裝,你應該定期用 rustup update 來更新它,以保持你的工具鏈的新鮮,並使用 cargo update 來保持你的庫的最新版本。

Rust 語言版本的猜數字

Rust 是一門賦予任何人構建可靠和高效的軟體能力的語言。你可以通過編寫一個 Rust 版本的「猜數字」遊戲來探索 Rust。

第一步是編寫一個 Cargo.toml 文件。你可以使用 cargo new 命令生成一個骨架 Cargo.toml。這幾乎是開始一個 Rust 項目的最佳方式。

Cargo.toml 文件為你的包命名,並給它一些元數據,最重要的是,指明了它依賴於 rand crate。

authors = ["Moshe Zadka <moshez@opensource.com>"]# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Rust 中的許多東西不是由語言或標準庫提供的。取而代之的是,你可以從某個外部 crate 得到它們,這些 crate 可以做許多事情。

程序邏輯在 src/main.rs 中:

let mut rng = rand::thread_rng(); let random = rng.gen_range(1..101); println!("Guess a number between 1 and 100"); for line in std::io::stdin().lock().lines() { let parsed = line.ok().as_deref().map(str::parse::<i64>); if let Some(Ok(guess)) = parsed { _ if guess < random => println!("Too low"), _ if guess > random => println!("Too high"), println!("That's right");

代碼的前兩行聲明你要做什麼。在本例中,rand::Rng 生成一個猜測值,而 trait std::io::BufRead 使得可以從標準輸入中讀取。

Rust 代碼的入口在 main() 函數中,所以下一步就是定義 main()。

要給一個變量賦值,先放 let,再放變量的名字,後面放 = 號。這樣就創建了一個不可變變量。

Rust 中大多數變量都是不可變的,但是 rng 對象必須是可變的(mut)。例如,語句 let random = 0 給random 變量分配一個零值。

函數的第一行創建了一個線程安全的 Rng 對象,並將其分配給變量 rng。Rust 是建立在線程和內存安全的基礎上的,所以你必須在開始寫代碼時就考慮到這些事情。

程序的下一行讀取函數 gen_range() 的結果,並將其分配給名為 random 的變量。該函數取一個最小值(包含)和一個上界(不包含)。為了也包含上界,你可以用一個等號來標記較大的數字(例如,1...=100),或者你也可以像我在代碼中做的那樣,將上界設置為比你的預期最大值大 1。在這種情況下,該範圍是 1 到 100,使得遊戲剛好有足夠的挑戰性。

中央循環在 std::io::stdin() 中迭代行。由於有各種可能導致行不能讀取的例外情況,Rust 要求你用一個 Result 來包裹一行。有時候可能無法將一行解析為一個整數。

這段代碼使用條件模式匹配來忽略所有會導致錯誤的行:

let parsed = line.ok().as_deref().map(str::parse::<i64>); if let Some(Ok(guess)) = parsed {

第一行創建了一個 Result<Option<i64>, ...> 對象,因為它可能在讀取或解析步驟中失敗。由於下一行只在 Some(Ok(guess)) 上匹配,每當一行的結果是一個不匹配的值時,它就會跳過 if 語句。這是一種強大的忽略錯誤的方法。

Rust 支持條件表達式和流程控制,比如循環。在「猜數字」遊戲中,只要猜中的值不等於 random,Rust 就會繼續循環。

if 語句的主體包含一個 Rust 的 match 語句的三向分支。雖然 match 最常用於模式匹配,但它也可以檢查任意條件。在這種情況下是列印一個適當的信息,如果猜測是正確的,則中斷(break)循環。

示例輸出

現在你已經寫好了你的 Rust 程序,你可以運行它來玩「猜數字」遊戲。每次運行程序時,Rust 都會選擇一個不同的隨機數,所以繼續猜,直到找到正確的數字。

   Compiling guess v2020.11.0 (/Users/mzadka/src/guess)    Finished dev [unoptimized + debuginfo] target(s) in 0.70s     Running `target/debug/guess`Guess a number between 1 and 100

典型的做法是用 cargo run 來測試程序。最終,你可能會使用 cargo build 分成兩個獨立的步驟構建一個可執行文件並運行它。

學習 Rust

這個「猜數字」遊戲是學習一門新的程式語言的一個很好的入門程序,因為它以一種相當直接的方式鍛鍊了幾個常見的編程概念。通過在不同的程式語言中實現這個簡單的遊戲,你可以展示語言的一些核心概念,並比較它們的細節。

你有喜歡的程式語言嗎?你會如何用它來寫「猜數字」遊戲呢?請關注本系列文章,看看你可能感興趣的其他程式語言的例子吧!

via: https://opensource.com/article/20/12/learn-rust

作者:Moshe Zadka 選題:lujun9972 譯者:wxy 校對:wxy

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

我們將為您添加白名單,授權「轉載文章時可以修改」,

相關焦點

  • 通過編寫一個簡單的遊戲學習 C 語言|Linux 中國
    導讀:當你學習一門新的程式語言時,這個「猜數字」遊戲是一個很好的入門程序。下面是如何用 C 語言來編寫它。下面是如何用 C 語言來編寫它。 我在小學時就開始自學編程。我的第一個程序是在 Apple II 上編寫的,但最終,我還是通過看書和編程練習學會了 C 語言。練習編程的最佳方法是編寫示例程序,它能幫助你練習新知識。 在我學習一種新的程式語言時,我喜歡編寫一個簡單的「猜數字」遊戲來練習。
  • 編寫一個簡單的遊戲來學習 Python | Linux 中國
    導讀:通過編寫一個「猜數字」遊戲來探索 Python(和其他程式語言)。  本文字數:2488,閱讀時長大約: 3分鐘  https://linux.cn/article-12973-1.html作者:Moshe Zadka譯者:geekpi  通過編寫一個「猜數字」遊戲來探索 Python(和其他程式語言)。
  • 通過編寫一個簡單的遊戲學習 JavaScript | Linux 中國
    現在有很多東西要學習,開始學習這種流行語言的好方法是編寫一個簡單的應用程式以熟悉某些概念。最近,一些人寫了關於如何通過編寫簡單的猜謎遊戲來學習自己喜歡的語言的文章,因此這是一個很好的起點!現在開始吧JavaScript 有許多種風格,但我將從最基本的開始,通常稱為 「普通 JavaScript」。
  • 編寫一個簡單的遊戲來練習用 C+編程|Linux 中國
    學習一門程式語言有幾種方法。如果你是編碼新手,你通常會學習一些基本的計算機編碼概念,並嘗試應用它們。如果你已經知道如何用另一種語言進行編碼,你可以重新學習編碼概念在新語言中是如何表達的。 不管是哪種情況,學習這些新原理的便捷方法是創建一個簡單的猜謎遊戲。
  • 編寫一個簡單的遊戲來練習用 C++ 編程 | Linux 中國
    如果你是編碼新手,你通常會學習一些基本的計算機編碼概念,並嘗試應用它們。如果你已經知道如何用另一種語言進行編碼,你可以重新學習編碼概念在新語言中是如何表達的。  不管是哪種情況,學習這些新原理的便捷方法是創建一個簡單的猜謎遊戲。這會迫使你了解一門語言如何接收輸入和發送輸出,如何比較數據,如何控制程序的流程,以及如何利用條件來影響結果。
  • 通過編寫「猜數字」遊戲學習 Lua | Linux 中國
    它通過基於寄存器的虛擬機解釋字節碼來運行,它可以用於過程式編程、函數式編程和數據驅動編程等編程方式。它甚至可以通過巧妙地使用數組(即「表(table)」)來模擬類,以用於面向對象的編程。感受一門語言的好方法是通過編寫一個你已經熟悉的簡單應用。最近,一些作者已經演示了如何使用他們最喜歡的語言來創建一個「猜數字」遊戲。Lua 是我最喜歡的語言之一,所以這是我的 Lua 版猜數字遊戲。
  • 編寫一個簡單的遊戲來練習用 C++ 編程
    學習一門程式語言有幾種方法。如果你是編碼新手,你通常會學習一些基本的計算機編碼概念,並嘗試應用它們。如果你已經知道如何用另一種語言進行編碼,你可以重新學習編碼概念在新語言中是如何表達的。不管是哪種情況,學習這些新原理的便捷方法是創建一個簡單的猜謎遊戲。這會迫使你了解一門語言如何接收輸入和發送輸出,如何比較數據,如何控制程序的流程,以及如何利用條件來影響結果。
  • 【Rust日報】 2019-08-28:Rust異步代碼的優勢:相比於其他語言更加容易調試
    #await #tcp作者通過創建了一個TCP客戶端的項目Clobber來體驗將在1.39中穩定的Async/Await的功能,結論:體驗非常好,非常期待Rust異步穩定之後,社區將會帶來什麼變化。通過AVL樹來理解Rust的所有權#Elixir #AVL一個Elixir程式設計師開始學習Rust,在看完Too Many LinkedList之後,進一步實現更複雜的數據結構:AVL樹(自平衡二叉查找樹),以此來學習Rust的所有權機制。
  • 為什麼選擇Rust?
    「程序正確性是通過測試來檢驗的」和「程序正確性是經過邏輯驗證的」之間存在著巨大的差異。不幸的是,即使我們對代碼的每一行都進行了測試,我們仍然不能確保它是正確的。然而,擁有一個形式系統來證明我們的代碼是正確的(至少在某些方面是正確的)則是另一回事了。
  • 簡單聊聊Linux學習經歷
    而對於我一個學生來說,更是在不斷地學習中成長的,從課程知識的學習,到學習做人的道理,為人處事的道理等等,都是在時刻進行中。那麼,今天我就聊聊我學習過程中的一個小經歷-Linux學習經歷。不知道大家對Linux了解有多少,說實話,上大學之前我對於Linux是一無所知的,因為之前沒有電腦,對電腦僅有的接觸就是在學校機房的電腦課程學習中的接觸,而且當時只是學習一些簡單的電腦操作,比如打字,一些簡單的計算等,對於系統知識完全涉及不到
  • Linux內核學習:簡單的字符設備驅動
    ·下面是一個簡單字符設備示例,實現了基本的open、read和write方法:代碼文件:#include <linux/init.h>#include <linux/module.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/uaccess.h>
  • 【Rust日報】2020-09-25 構建一個Rust運行時反射系統(第一篇)
    構建一個Rust運行時反射系統(第一篇)作者的公司在做一款叫oso的產品,旨在通過提供一門叫Polar的申明式語言,
  • 生成 ETH 公私鑰與地址 | Rust 學習筆記(二)
    本篇是 Rust 學習筆記的第二篇。
  • 【Rust日報】 2019-11-15 RustyBox 一個完全用rust重寫的 BusyBox
    RustyBox 一個完全用rust重寫的 BusyBox真的是很猛busybox是linux開發者最常用的一套cmd
  • 搜索、學習和實踐 Linux 命令!! | Linux 中國
    假設你想下載一個壓縮文件,將其解壓縮,並從命令行中將文件從一個位置移動到另一個位置。根據上面的場景,我們可能需要至少三個 Linux 命令,一個用於下載文件,一個用於提取下載的文件,一個用於移動文件。如果你是中高級 Linux 用戶,你可以通過一行命令或腳本在幾秒鐘/分鐘內輕鬆完成這一任務。但是,如果你是一個不懂得太多 Linux 命令的菜鳥你可能就需要一些幫助了。
  • VS Code 搭建 Rust 開發環境
    上一篇文章安裝和配置好了 Rust 環境後,我們是使用的是簡單的文本工具編寫 Hello World 入門代碼,但是為了提高我們的學習效率,下面安利大家 VS Code 搭建 Rust 開發環境,讓我們開始享受 IDE 帶來的便利。
  • 【Rust日報】2020-08-15 Rust Nightly 標準庫文檔已涵蓋了每個關鍵字
    詳細可查看這三個連結:標準庫:https://doc.rust-lang.org/stable/std/#keywordsunsafe 關鍵字:https://github.com/rust-lang/rust/pull/73943原始類型關鍵字:https://github.com/rust-lang/rust/issues/34601學習Rust,沮喪?
  • ...Bash | Linux 中國|linux|程式語言|bash|shell|隨機數_網易訂閱
    導讀:編程一個簡單的遊戲是練習一門新語言並與其他你掌握的語言進行比較的好方法。  本文字數:2676,閱讀時長大約: 3分鐘  https://linux.cn/article-12962-1.html作者:Jim Hall譯者:Xingyu.Wang  學習一門新的程式語言是很有趣的。每當我嘗試學習一門新的語言時,我都會專注於定義變量、編寫語句和評估表達式。
  • 學習Linux系統需要明白的一些事情
    直到有一次找工作的時候,看見一個公司招運維人員,抱著試試的態度去跟面試官了解了解,比較幸運的是人家願意試用3個月,然後就正式邁出人生職業的第一步,在實習當中才接觸到linux,然後跟著師父一步一步的深入了解linux,我也以我6年的運維經歷及學習linux的經驗跟大夥分享下我的一些看法,當然,在IT行業,分享是一種精神,也是一種美德。
  • 在Rust 代碼中編寫 Python 是種怎樣的體驗?
    我們將從一個比這個簡單得多的案例開始,然後逐步努力以達到這個結果(甚至更多!)。運行Python代碼首先,讓我們看一下如何在Rust中運行Python代碼。(甚至在Rust中編寫Python庫,但這是另一個主題。)它的Python::run 功能完全符合我們的需求。它將Python代碼作為&str,並允許我們使用兩個可選的PyDicts 來定義範圍內的任何變量。