rust学习记录2-猜数游戏
通过一个例子了解一些基本概念。这个例子就用rust最常用的猜数游戏来做,好像官方教程就是用的这个例子。这个例子的功能:生成一个1到100之间的随机数,然后在终端中提示玩家输入一个猜测的数,猜完之后提示大了还是小了,如果猜测正确就打印相应信息,程序退出。```
use std::io;
fn main(){
println!(“猜数游戏开始”);
println!(“猜一个数:”);
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("无法读取行");
println!("猜测的数字是:{}",guess);
}
```
通过这个程序进行了一些总结:
Rust中变量一旦赋值就不可变,要想改变赋值,就要用mut修饰。
String::new()会返回字符串的新的实例,::表示new()是String类型的关联函数,关联函数就说明这个函数是针对String这个类实现的,而不是String的某个实例对象的方法。
read_line就是读取用户输入并放到字符串中。
需要注意的是,这个用来接收的字符串要可变,因为用户的输入是变化的,所以加mut修饰。前面有一个&取地址符号,表明这个变量是一个引用,这样可以在程序的不同地方引用这个变量,这样这个方法里面的guess和外面的guess指向同一个地址。引用的具体用法后面还要详细介绍。
引用在rust中也是不可变的,所以也需要加上mut
Read_line的返回值是一个Result类型的,Result这个类型是一个枚举类型,有两个值,OK和Err。在OK中存放读入的值,Err中存放错误类型。如果成功返回OK,如果失败返回Err。Expect是其中一个方法,花括号{}是一个占位符。
继续细化猜数游戏:生成神秘数字。这里主要是学习怎么添加外部依赖包。
```
use std::io;
use rand::Rng;
use std::cmp::Ordering;
fn main() {
loop {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..100);
println!("The secret number is {}", secret_number);
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(_) => 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;
},
}
}
}
```
涉及到的知识点:
在终端直接cargo add 这个包的名字,这是局部添加依赖
还可以在Cargo.toml文件中的下添加依赖,这是全局添加依赖。如下:
```
rand = "^0.8.5"
```
前面有个^表示任何与rand包的0.8.5版本兼容的都行。
可以简写成这样:
```
rand = "0.8.5"
```
Vscode会把这些相关依赖都下载好。
在cargo.lock这个文件是首次执行cargo build命令的时候创建的,后续运行的时候会找一下这个文件里指定的这些依赖的版本是否存在,如果存在就用对应的版本。
执行cargo update这个命令时,会忽略cargo.lock这个文件里的内容,并通过更新的注册表找到cargo.toml里写明的最新版本的包,再把最新版本写入到Cargo.lock里。
Rng这个trait里定义了随机数生成器所要用到的方法,trait可以看作其他语言里的接口。
Ordering是一个枚举类型
cmp两端是用来比较的对象,这里就是比较guess和secret_number,cmp这个方法的返回值就是Ordering枚举类型。
match方法根据返回的Ordering枚举类型的返回值决定接下来做什么,match就是由多个分支arm组成的,match会在后面详细介绍,因为在rust里match比较重要。
在定义数字的时候不需要指定是什么类型,这里随机生成1到100之间,很多类型都能涵盖这个范围,这里视为i32类型。
trim方法是用来去掉两端的空白,parse方法就是解析成整数,所以prase方法也是返回一个result类型。
同一个变量可以重复赋值,在rust里叫隐藏shadow 感觉挺有意思的 :lol 学习一下,研究研究。 学习学习 又学到一招{:1_918:} rust我看好多地方都出现了。主要替换什么语言啊? 学习了,挺有意思的 锈化编程,有点意思{:1_918:} ailangzhou 发表于 2024-11-21 09:51
rust我看好多地方都出现了。主要替换什么语言啊?
一般来说是对标 C++,作为内存安全语言 学习了,直接用,看看我的
页:
[1]
2