前情提要
筆者就照著官方教學文件,繼續往下走了,來到撰寫猜謎遊戲的環節,主要是做一個command line
互動遊戲,因為尚未講解到語法、資料型別等,因此這個猜謎遊戲就當作初試Rust
的撰寫體驗,不了解的部份,由後面章節會繼續介紹其語法、資料型別等。官方文件的策略是先由一個簡單的小遊戲,來入門Rust
的程式語法、思考邏輯、Coding Style
等。
內容
程式內容為使用亂數產生1~100間的數字,與使用者輸入的數字做對比,沒有猜對,可以一直猜下去,猜對則跳出成功訊息結束。
建立專案
已經介紹過Cargo
,官方也建議使用Cargo
做建立專案,套件管理,建置、執行專案,首先,建立一個猜字遊戲專案
1 | cargo new guessing_game |
先用cargo
指令執行驗證看看
1 | cargo run |
讀取使用者輸入值
猜謎遊戲第一步就是要讓使用者輸入猜數,程式實作要讀取使用者輸入值並存至變數中,爾後需與隨機產生的數字作比較,來看看Rust
語言要怎麼實作吧
宣告變數值
首先要宣告一個變數值存入使用者輸入值
1 | let mut guess = String::new(); |
由於Rust
本身宣告變數時,預設是不可變的,若是可變動變數則需要加一個mut
關鍵字於變數名稱前方,接著看到的是String::new()
,new是String型別的關聯函式,需使用::
這個符號串接,其實也沒這麼複雜,就是new出一個空字串。
讀取使用者輸入值
讀取使用者輸入值需引入標準函式庫,使用use
關鍵字引入函式庫,函式庫為std
底下的io
1 | use std::io; |
若沒有使用use std::io;
則撰寫時std::io::stdin()
,就是呼叫標準函式庫下的io
函式庫,io
函式庫下有一個command line
輸入值handle的型別函式stdin
。
stdin
函式底下有一個method
名稱叫read_line
,使用該方法可以取得使用者輸入值,那讀出來的輸入值存到哪個變數中呢,由method
的parameter
中傳入,道理跟上面宣告變數一樣,Rust
世界中預設皆不可變,因此需要使用&mut guess
傳入,若維持不可變則使用&guess
傳入即可,其中&
這個符號reference
的概念,之後筆者會照著官方教學,會有一篇獨立的教學文章來說明。
最後是expect
,Rust
這邊將標準函式庫中的method
回傳值都包裝成泛型Result型別
,因此透過Result
型別我們可以處理可能發生的Exception
,Result
型別底下有一個method
,名稱叫expect
,以結果ok
或error
而傳入不同參數給expect
方法,筆者以vscode
中expect
的解說中的範例來說
1 | // expect的方法定義 |
以結果來看,若發生Error
則,顯示訊息會是「傳入的string:error訊息
」,因此若以筆者上述宣告的來說,發生錯誤則會顯示「讀取該行失敗:error訊息
」,先有這樣的概念即可。
輸出猜數
最後將使用者輸入的猜數印出來做這段的結尾,使用println!
文字格式化輸出
1 | println!("你的猜測數字:{}", guess); |
完整程式碼
最後組合一下上面宣告的那些程式碼,完整程式碼如下
1 | use std::io; |
執行結果
依照上述程式碼,跟著筆者一起來看看執行結果吧
1 | cargo run |
結論
猜謎遊戲就先到這邊,下篇繼續完成其他部份,筆者最後recap一下今天所學的東西
- 引入
package
函式庫,使用use
關鍵字,例:use std::io;
- 宣告不可變參數,使用
let
及mut
關鍵字,例:let mut guess = String::new();
- 取得使用者輸入值,使用
io
函式庫下的stdin
函式庫中的read_line
方法,例:io::stdin().read_line(&mut guess);
- 泛型
Result
型別中的expect
方法,宣告輸出error
訊息時的搭配訊息,例:expect("該行讀取失敗");
- 格式化輸出技巧,使用
{}
符號定義參數取代位置,會依序取代,例:println!("你的猜測數字:{}", guess);
::
符號:函式庫取用,例:io::stdin()
,String::new()
&
符號:reference
的方式傳入,例:read_line(&mut guess);
參考