1.前端学习Rust第一个里程碑,完成猜数游戏

看一段代码,在没学过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的感受。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章