真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

這篇文章主要講解了“Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程”吧!

成都創(chuàng)新互聯(lián)公司專(zhuān)注于新都企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都商城網(wǎng)站開(kāi)發(fā)。新都網(wǎng)站建設(shè)公司,為新都等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站建設(shè),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

Rust如何管理項(xiàng)目

并不是所有的代碼都像hello_world.rs一樣,一個(gè)文件就可以搞定。一個(gè)項(xiàng)目往往具有復(fù)雜的代碼,我們需要一種機(jī)制來(lái)管理這種復(fù)雜性,將一個(gè)項(xiàng)目切分成若干小部分,每個(gè)部分再進(jìn)行切分,層層抽象,直到達(dá)到人腦可以處理的規(guī)模。每種編程語(yǔ)言都有這樣的機(jī)制,例如Java的package機(jī)制,Rust也不例外。

Rust用了兩個(gè)概念來(lái)管理項(xiàng)目:一個(gè)是crate(項(xiàng)目),一個(gè)是mod(模塊)。模塊是用于在crate內(nèi)部進(jìn)行分層和封裝的機(jī)制,模塊內(nèi)部可以包含模塊。

  • crate:可以簡(jiǎn)單理解為一個(gè)項(xiàng)目,crate是Rust中的獨(dú)立編譯單元(compile unit),每個(gè)crate對(duì)應(yīng)生成一個(gè)庫(kù)或者可執(zhí)行文件。作為對(duì)比,我們比較熟悉的C語(yǔ)言中,一個(gè)單獨(dú)的.c文件和其所有的include文件組成一個(gè)編譯單元,每個(gè).c生成一個(gè).o,然后將這些.o鏈接起來(lái)生成可執(zhí)行文件。

  • mod:可以簡(jiǎn)單理解為命名空間。mod可以嵌套(注意crate之間不能出現(xiàn)循環(huán)引用),還可以控制內(nèi)部元素的可見(jiàn)性。

說(shuō)到可見(jiàn)性問(wèn)題,在Rust中,元素默認(rèn)都是私有的,用pub關(guān)鍵字修飾的才是公開(kāi)的。公開(kāi)和私有的訪問(wèn)權(quán)限規(guī)定如下:

  • 如果一個(gè)元素是私有的,那么只有本模塊內(nèi)的元素以及它的子模塊可以訪問(wèn)

  • 如果一個(gè)元素是公開(kāi)的,那么可以在本模塊外的作用域訪問(wèn)它。

模塊是一種抽象的概念,文件是承載這個(gè)概念的實(shí)體,但是模塊和文件并不是簡(jiǎn)單的一一對(duì)應(yīng)關(guān)系。在一個(gè)crate內(nèi)部創(chuàng)建mod的方式有下面三種:

  • 在一個(gè)rs文件中創(chuàng)建內(nèi)嵌模塊,直接使用mod關(guān)鍵字即可。

  • 獨(dú)立的一個(gè)rs文件就是一個(gè)模塊,文件名即是模塊名。

  • 一個(gè)文件夾也可以創(chuàng)建一個(gè)模塊,文件夾內(nèi)部要有一個(gè)xxx.rs文件,這個(gè)文件是這個(gè)模塊的入口。必須要在這個(gè)xxx.rs中聲明其子模塊,否則子模塊無(wú)法被當(dāng)成這個(gè)項(xiàng)目的源碼進(jìn)行編譯。

新建項(xiàng)目

cargo不僅是Rust的包管理器,還可以用于創(chuàng)建項(xiàng)目。使用下列命令可以創(chuàng)建一個(gè)名為guessing_game的項(xiàng)目:

cargo new guessing_game --bin

注意,后面的--bin意味著我們希望項(xiàng)目生成的是可執(zhí)行程序,如果希望是library,則可以使用--lib選項(xiàng)。

以上為在命令行中手工創(chuàng)建項(xiàng)目,在Clion中可以點(diǎn)擊File->New Project后如下圖填寫(xiě),然后點(diǎn)擊Create按鈕:

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

項(xiàng)目結(jié)構(gòu)

我們可以使用tree .命令或者直接在Clion中查看當(dāng)前的文件夾結(jié)構(gòu),如下圖所示:

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

  • src/main.rs:這是cargo自動(dòng)生成的rs文件。還記得前面講的crate和mod的概念嗎?在這個(gè)項(xiàng)目中,guessing_game是crate,src文件夾是mod,main.rssrcmod的入口。我們可以在srcmod中創(chuàng)建子模塊,但注意,這些子模塊都要在main.rs中聲明,否則無(wú)法參與編譯。

  • .gitignore:這是git忽略文件,不懂其作用的同學(xué)可以自行搜索。這里重點(diǎn)要說(shuō)的是通過(guò)cargo new創(chuàng)建的項(xiàng)目天然就是一個(gè)git項(xiàng)目,這也印證了Rust對(duì)開(kāi)源的擁護(hù)。

  • Cargo.toml:這是項(xiàng)目管理配置文件。TOML是一種非常簡(jiǎn)潔好用的配置文件格式,TOML是Tom's Obvious, Minimal Language的首字母縮寫(xiě),這里的Tom是Github的聯(lián)合創(chuàng)始人之一,感興趣的同學(xué)可以進(jìn)一步自行了解TOML配置文件的寫(xiě)法。

  • Cargo.lock:該文件包含項(xiàng)目依賴項(xiàng)的確切信息,由Cargo維護(hù),我們無(wú)須關(guān)心它。

編譯執(zhí)行

src/main.rs里cargo已經(jīng)自動(dòng)生成了輸出Hello, world!的代碼,我們來(lái)運(yùn)行一下它看能否正常輸出。

插一句題外話,在你日后漫長(zhǎng)的Rust編碼生涯中,你會(huì)發(fā)現(xiàn),你將在處理編譯錯(cuò)誤上耗費(fèi)大量的時(shí)間。還記得嗎,Rust 的一大特色是保證內(nèi)存安全,這保證了Rust代碼只要運(yùn)行起來(lái)就幾乎不會(huì)發(fā)生內(nèi)存錯(cuò)誤,這么誘人的效果的背后的代價(jià)就是,我們要在編碼時(shí)付出額外的努力。Rust為了保證內(nèi)存安全設(shè)計(jì)了一套復(fù)雜的規(guī)則,這導(dǎo)致我們的代碼一不留神就會(huì)編譯不過(guò)。所以,在你日后經(jīng)常用的一個(gè)操作就是檢查能否編譯通過(guò),而不是直接編譯,因?yàn)橹苯泳幾g還要做代碼優(yōu)化等會(huì)相對(duì)費(fèi)時(shí)。可以使用下列命令檢查編譯錯(cuò)誤:

cargo check

在Clion中需要新加一個(gè)Configuration來(lái)執(zhí)行cargo check命令,如下圖所示:

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

確保cargo check通過(guò)后,可以執(zhí)行cargo build來(lái)執(zhí)行編譯。編譯后會(huì)產(chǎn)生一個(gè)target文件夾,在target/debug下會(huì)有一個(gè)和crate同名的可執(zhí)行文件。但一般為了方便,可以直接執(zhí)行cargo run,這條命令等價(jià)于先編譯后執(zhí)行。下圖是執(zhí)行cargo run后Clion的控制臺(tái)輸出:

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

猜謎游戲

在完成了項(xiàng)目搭建后,接下來(lái)就要開(kāi)始猜謎游戲的代碼編寫(xiě)了,我將它們分成六部分:創(chuàng)建變量、輸入、輸出、錯(cuò)誤處理、隨機(jī)數(shù)生成、完整代碼。

創(chuàng)建變量

使用let語(yǔ)句創(chuàng)建變量,需要注意的是,在Rust中,變量默認(rèn)是不可變的,可以在變量名前使用mut來(lái)使得變量可變:

let a = 5; // 不可變
let mut b = 10; // 可變

在上面的let語(yǔ)句中,我們并沒(méi)有顯示聲明變量的類(lèi)型,但這并不代表Rust是動(dòng)態(tài)類(lèi)型的,Rust仍然是靜態(tài)類(lèi)型的,只不過(guò)Rust有一個(gè)可以通過(guò)上下文推斷類(lèi)型的強(qiáng)大編譯器。

輸出

我們?cè)缫言?code>hello_world.rs中見(jiàn)識(shí)過(guò)了最基本的輸出方式:

println!("Hello, world!");

需要注意的是,這里的println!是一個(gè)宏,而非一個(gè)函數(shù),println后面的感嘆號(hào)就是宏的標(biāo)志。Rust中的宏與C/C++中的宏是完全不一樣的東西,簡(jiǎn)單說(shuō),可以把它理解為一種安全版的編譯期語(yǔ)法擴(kuò)展。這里之所以使用輸出宏而非函數(shù),是因?yàn)闃?biāo)準(zhǔn)輸出宏可以完成編譯期格式檢查,更加安全。

如果需要輸出某個(gè)變量的值,可以使用占位符{},例如:

let x = 0;
let y = 10;
println!("x = {} and y = {}", x, y);

其輸出結(jié)果為:

x = 0 and y = 10
輸入

為了從控制臺(tái)中獲取用戶的輸入,需要使用標(biāo)準(zhǔn)庫(kù)std::io。使用use語(yǔ)句將該庫(kù)引入當(dāng)前作用域:

use std::io;

我們可以使用io庫(kù)中的函數(shù)stdin

let mut guess = String::new(); // 創(chuàng)建一個(gè)字符串類(lèi)型的可變變量
io::stdin().read_line(&mut guess).expect("Failed to read line");

stdin函數(shù)返回一個(gè)std::io::Stdin的實(shí)例,這代表終端標(biāo)準(zhǔn)輸入句柄的類(lèi)型。然后調(diào)用read_line方法,可以從標(biāo)準(zhǔn)輸入中讀取一行并存入到guess變量中去。&表示這是一個(gè)引用,這是一個(gè)復(fù)雜的特性,我們現(xiàn)在無(wú)須了解它。

讀取用戶輸入后,我們需要判斷用戶是否正確輸入了數(shù)字。String類(lèi)型帶有處理字符串處理的一些方法:

let guess: u32 = guess.trim().parse().expect("Please type a number!");

字符串的 parse 方法將字符串解析成數(shù)字。因?yàn)檫@個(gè)方法可以解析多種數(shù)字類(lèi)型,因此需要告訴 Rust 具體的數(shù)字類(lèi)型,這里通過(guò) let guess: u32 指定。guess 后的冒號(hào):告訴 Rust 我們指定了變量的類(lèi)型。Rust 有一些內(nèi)建的數(shù)字類(lèi)型,u32 是一個(gè)無(wú)符號(hào)的 32 位整型。trim方法用于消除回車(chē)空格等符號(hào)。

錯(cuò)誤處理

上一小節(jié)代碼中還有一個(gè)expect沒(méi)有分析,而這就涉及到Rust中的錯(cuò)誤處理機(jī)制了。read_line的返回值類(lèi)型是io::Result,它是Result類(lèi)型在io模塊的特化版本。Result是枚舉類(lèi)型,其成員為OkErr,Ok 成員表示操作成功,內(nèi)部包含成功時(shí)產(chǎn)生的值。Err 成員則意味著操作失敗,并且包含失敗的前因后果。

Result類(lèi)型的作用是編碼錯(cuò)誤處理信息。Result 類(lèi)型像其他類(lèi)型一樣,擁有定義于其上的方法。io::Result的實(shí)例擁有expect方法。如果 io::Result 實(shí)例的值是 Err,expect 會(huì)導(dǎo)致程序崩潰,并打印參數(shù)傳遞給 expect 的信息。如果io::Result實(shí)例的值是 Ok,expect 會(huì)獲取 Ok 中的值并返回。在本例中,這個(gè)值是用戶輸入到標(biāo)準(zhǔn)輸入中的字節(jié)數(shù)。

隨機(jī)數(shù)生成

猜謎游戲需要能夠自動(dòng)生成隨機(jī)數(shù)。Rust標(biāo)準(zhǔn)庫(kù)中尚未包含隨機(jī)數(shù)功能,但我們可以通過(guò)引入外部crate來(lái)獲得隨機(jī)數(shù)功能。還記得Rust的官方開(kāi)源倉(cāng)庫(kù)嗎,那里可是有很多寶貝的。打開(kāi)https://crates.io/,在搜索框中鍵入rand來(lái)搜索具有隨機(jī)數(shù)功能的crate,出來(lái)的第一個(gè)結(jié)果就是我們需要的crate。

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

現(xiàn)在我們將這個(gè)庫(kù)引入到我們的項(xiàng)目中。打開(kāi)Cargo.toml,在[dependencies]下添加:

[dependencies]

rand = "0.8.3"

[dependencies] 告訴 Cargo 本項(xiàng)目依賴了哪些外部 crate 及其版本。

下面使用rand庫(kù)來(lái)產(chǎn)生隨機(jī)數(shù)。首先,使用use語(yǔ)句引入randuse rand::Rng;。然后調(diào)用下列函數(shù)產(chǎn)生一個(gè)1和100之間的數(shù):

let number = rand::thread_rng().gen_range(1..=100);
完整代碼

猜謎游戲的完整代碼如下。

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1..=100);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}

其中,涉及控制流操作的loop、match、continue、break等語(yǔ)法,大家應(yīng)當(dāng)能夠望文生義。對(duì)于這個(gè)完整代碼,大家能夠閱讀并知道每一行干了啥即可,不必糾結(jié)于語(yǔ)法細(xì)節(jié)。

猜謎游戲運(yùn)行結(jié)果如下:

Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程

感謝各位的閱讀,以上就是“Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)名稱:Rust學(xué)習(xí)筆記之實(shí)現(xiàn)一個(gè)猜謎游戲小項(xiàng)目的方法教程
文章路徑:http://weahome.cn/article/ggicgh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部