看一段代码,在没学过rust前提下,尝试理解下。
use std::io;
use rand::Rng;
use std::cmp::Ordering;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
println!("Please input your guess.");
let mut guess = 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
};
match guess.cmp(&secret_number){
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal=>{
println!("You win");
break;
}
}
}
}
let secret_number = rand::thread_rng().gen_range(1..=100);
,这个是生成一个1到100之间的数,其中rand需要安装,起初下载速度很慢,就在我搜索解决办法时候,下载完了。
包管理这块跟前端挺像的。只是这个命名方式,::应该是调用静态方法,1..=100这个怎么看也不如1,100这种直观。
loop 表现循环,let mut guess = String::new();
, 单独用let声明的不可变,加上mut才可变。rust有类型推导,String::new()这种就知道是字符串了,不需要在变量上声明。
io::stdin().read_line
,可以让用户在命令行输入内容,它会返回一个Result类型,.expect("Failed to read line");
就是用来处理。其实这里没有体现出价值,出问题也是退出执行,出问题也是系统问题,感觉不退出也没什么好做的。不加程序能运行,但会有警告。
&表示这是一个参数的引用,它允许多处代码访问同一数据,
let guess:u32
是rust本身支持的,用来避免类型转换导致的变量声明,但是前面这个let还是会让我觉得是声明了一个新变量,加个标识符表明这种行为岂不是更好。match
是用来处理枚举的,类似于条件语句,.trim().parse就是转换为数字,因为前面有:u32,所以这里就是转换为数字,这个挺好的。后面的花括号就是处理parse返回的枚举,ok就原值返回,Err就是触发continue,防止退出程序。 _是一个通配符,用来匹配所有 Err 值,不管其中有何种信息。
guess.cmp(&secret_number) 就是比较两个值的大小,前面的match用来配合后面的花括号区域处理不同结果,Ordering::Less 小于。Ordering::Greater大于。Ordering::Equal等于,然后break退出。
match处理更有整体感,功能分割的很好,但是导入语句以及枚举类型的复杂度,也增加了不少心智负担。 loop这种确实简练很多,以上就是我学了一阵Rust的感受。