文章目錄
- Rust語言介紹和猜數字游戲的實現
- cargo是什么
- 使用Rust編寫猜數字
Rust語言介紹和猜數字游戲的實現
Rust語言是一種系統編程語言,核心強調安全性、并發性以及高性能,由類似于C/C++的底層控制能力,性能也非常接近,Rust有一些特性
- 所有權系統,這個可以自動管理內存,無需垃圾回收器,保證數據的安全
- 零成本抽象,高層抽象不會帶來運行時的開銷,運行時的效率會很高
- 線程安全,在編譯階段就能防止數據競爭的問題
- 強類型語言,類型轉換非常嚴格,提升代碼的可靠性
- cargo管理工具非常好用,簡化項目的管理和依賴管理
cargo是什么
cargo是rust的官方管理構建工具,一來可以創建項目、構建項目、運行項目,二來可以管理整個項目依賴的第三方庫,cargo基本上涵蓋了所有的第三方庫,可以在www.crate.io
中查看
一些常用的方法如下
cargo new project_name # 創建rust項目
cargo build # 構建項目生成可執行文件
cargo run # 構建并允許項目
cargo add lib_name # 添加最新版本依賴
cargo remove lib_name # 刪除依賴
cargo update [lib_name] # 更新依賴 不指定的話是更新所有依賴
cargo --help
- 新創建的rust項目中會包含項目配置文件,包含項目名稱、項目版本、第三方庫的信息
- 創建項目可以在命令后指定項目類型
cargo new project_name --bin(--lib)
- 默認為bin
- 分別為二進制項目和庫項目
- 也就是說可以指定我寫的項目是可執行文件,必須有
main.rs
和main
函數作為程序入口 - 庫項目主要是用于封裝邏輯,供其他程序調用,第三方庫也都是庫項目
- 創建項目可以在命令后指定項目類型
cargo run
可以指定debug模式或者release模式分別使用--debug
,--release
默認為debug- 可以指定版本,例如
cargo add rand@0.7
- 也可以直接在配置文件中添加
rand = "0.7"
- 也可以直接在配置文件中添加
使用Rust編寫猜數字
這里我們先不具體介紹規則,只是大概了解一下
- Rust的庫管理是通過
Crate
(包)進行管理的,主要分為第三方庫和本地庫 - 在Rust中是區分函數和宏的,使用宏時需要加
!
fn
表示函數1..101
是表示范圍的形式,等價于1 <= num && num < 101
- 如果是閉區間則是
1..=100
- 如果是閉區間則是
loop
表示死循環,等價于while(true)
- 在使用模塊時需要指定,類似于C++的作用域
- 聲明變量時使用
let
- 可以不指定類型,例如
let rand_num
會自動補全類型 - 有時需要指定類型,例如
let guess: u32 =
或者let mut guess: String =
- 雖然可以不指定類型,但是Rust是一個強類型的語言
mut
指的是一個變量是否可以改變,類似于C++中的const
但是是相反的作用- 也就是說Rust的變量默認是不可被重新賦值的,只有被設定為
mut
才可以
- 可以不指定類型,例如
- match 表示的是模式匹配,可以理解為一個高級的switch語句
- 基本語法是 match value {} (value是要匹配的值)
- 然后其中的每一項表示對應的返回值或者語句
- 可以使用{}來寫多個語句
_
表示default
- Rust在可能失敗的方法中會返回一個
Result
類型,主要是用于錯誤處理- 需要在返回值中使用
.expect("")
進行處理 - 或者使用
match
分別對成功和失敗進行處理
- 需要在返回值中使用
use rand::Rng; // 引入第三方庫
use std::{cmp::Ordering, io}; // 主函數
fn main() { println!("Guess Num");let rand_num = rand::rng().random_range(1..101); // 生成一個1到100的隨機數println!("random num is {}", rand_num);loop {println!("Please Input Your Guess:");let mut guess: String = String::new();io::stdin().read_line(&mut guess).expect("Failed to read line");let guess: u32 = match guess.trim().parse() {Ok(num) => num,Err(_) => {println!("Place input a NUM!");continue;}};println!("You Guessed {}", guess);match guess.cmp(&rand_num) {Ordering::Less => println!("Too Small"),Ordering::Greater => println!("Too Big"),Ordering::Equal => {println!("You Win!");break;}}}
}