文章目录
- 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;}}}
}