前情提要
筆者這邊利用下班、假日時間,打算花半年時間學習新的程式語言,將所學過程紀錄下來,寫成部落格,雖然Rust
的教學文件非常的完整,也有繁體中文的版本,但筆者認為唯有用自己的話寫下來,讓別人懂,才是真正學會,因此決定撰寫Rust
教學系列文章。
目前來到官網範例中的「猜謎遊戲
」環節,[Rust]教學系列-猜謎遊戲:取得使用者輸入值已經可以取得使用者輸入的猜數值,這篇要來繼續撰寫,取亂數的部份,我們要用到Cargo
的方式將取得隨機亂數函式庫引進來,使用該套件產生1~100間的亂數,跟著筆者一起實作吧。
內容
這篇使用rand
套件來實作取亂數,筆者之前就有提到官方建議cargo
來管理其相依套件,那套件本身會在哪裡,讓我們使用cargo
指令來下載呢,答案就是crate
,使用其他的語言舉例來說的話,nodejs
使用npm
管理相依套件,那會有npm public registry
,讓我們可以用npm i
去下載相依套件,又如寫.net
的工程師來說,會使用nuget
管理相依套件,那也會有一個nuget gallery
公開的registry
,可以連線下載,那Rust
語言來說用cargo
管理相依套件,會從https://crates.io/下載其相關套件。
Crates.io 是個讓 Rust 生態系統中的每個人都能發佈它們的開源 Rust 專案並讓其他人使用的地方
安裝rand套件
筆者[Rust]教學系列-Hello Cargo中有大概講解一下其cargo
指令建立專案後的檔案結構,其中Cargo.toml
中的dependencies
區塊中宣告我們相依套件,因此我們會在這宣告需要使用到的套件rand
1 | [dependencies] |
接著使用cargo
指令建置,因為上面已設定相依套件,因此建置過程會安裝相依套件,意即rand
套件相依的套件也會一併安裝
1 | cargo build |
可以看出rand
套件相依套件有
cfg-if
ppv-lite86
getrandom
rand_core
rand_chacha
上述這些rand
套件相依的套件也會一併安裝
產生隨機數字
使用gen_range
這個方法取得隨機產生數值,可以傳入start..end
,該方法會從start
到end
之間的數字中,隨機取得一個數字當作回傳值
1 | use rand::Rng; |
上述程式碼中,引入rand package
中的Rng Trait
,其中使用thread_rng
的函式中的gen_range
方法,傳入參數為start..end
,包含start
,不包含end
,若要包含end
則需改用start..=end
,以上述例子來說,我們需要改成gen_range(1..=100)
,也是一樣的效果的。
透過Cargo指令產生技術文件
這時候是時候要來講一下Rust
語言的特色之一生產力
部份,以上述來說我們要從何而知這些套件有哪些方法可以使用,Rust
這邊有一個產生技術文件的機制,不過筆者不知道公開套件是否要上架前必須得提供技術文件,就不得而知了,不過筆者猜測是一定要的程序。
我們可以透過cargo doc —open
的方式產生並開啟,他就是一個html
格式的技術文件。基本上cargo
會掃描該專案下相依的套件(包含自己),產生成可讀性高的html
檔案,因為有下—open
,因此會產生完畢後會自動開啟。
產生技術文件檔案的相對路徑為{專案目錄}target/doc/guession_game/index.html
亦可到creates.io
中的該套件下的documentation
連結中看到一模一樣的技術文件,筆者猜測就是拿各套件的技術文件加以包裝,變成local
的技術文件檔案
完整程式碼
最後附上以上篇及這篇組合之下的程式碼
1 | use std::io; |
執行結果
依照完整程式碼,跟著筆者執行看看其效果吧
1 | cargo run |
結論
到這邊,已經完成猜謎遊戲的第二部份了,最後只剩下將使用者輸入值與隨機產生的神秘數字做一個比較,此部份會於下篇說明,最後筆者recap一下這篇講到的內容
- 編輯Cargo.toml中的dependencies區塊,宣告其套件其版本號,例:
rand = "0.8.3"
,透過cargo build
,將相依套件安裝好 - 透過
gen_range
方法可以取得在特定範圍內隨機產生的一組數字,有overload
方法,一個是傳入start..end
,另一個則start..=end
,依照個人喜好做選擇 cargo doc —open
指令的方式產生技術文件並開啟技術文件
參考