(二)Rust快速入门

223 阅读2分钟

注意:本教程面向于有语言基础的人员,重点对一些陌生概念和一些差距大的语法进行解释。

本篇将以一个猜数字游戏来带你快速入门Rust。

先看注释,后看补充!

use std::io::{self, Write};
use rand::Rng;  // Rng是一个trait: 用于定义共享的行为集合(类似于接口)
use std::cmp::Ordering; // Ordering是一个枚举

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..101); // 1..101代表一个范围
    println!("【猜数字】猜猜看我心里想的是哪个数字?答案:{}", secret_number);
    loop {
        print!("【猜数字】请猜一个数字:");
        // 刷新输出缓冲区,否则print!不会立即输出
        io::stdout().flush().expect("无法刷新输出缓冲区");
        // mut:关键字,标记变量为可变; String::new():创建String对象
        let mut guess = String::new();
        // 读取用户输入 -> 赋值给guess(这里加&mut是可变引用的意思)
        io::stdin().read_line(&mut guess).expect("无法读取行");
        // 对guess类型进行转换,从 String -> u32(Shadowing机制)
        let guess:u32 = match guess.trim().parse(){
            Ok(num) => num,
            Err(_) => continue,
        };
        // guess和secret_number进行比较,返回一个Ordering枚举类型{Less, Greater, Equal}
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("【猜数字】太小了!"),
            Ordering::Greater => println!("【猜数字】太大了!"),
            Ordering::Equal => println!("【猜数字】恭喜你猜对了!"),
        }
    }
}

补充:

  1. 1..101这种写法为Rust的范围表达式写法,这里表示半开区间(包含1,不包含101),其他写法:1..=101(闭区间)、..101(从负无穷到101)、101..(从101到正无穷)

  2. Rust为了提高性能减少IO操作频率,拥有IO缓冲机制。只有在缓冲区刷新时(换行、程序结束、调用flush)才会进行IO操作。这也是为什么print!不能立即输出的原因,需要使用flush()强制刷新缓冲区

  3. Rust拥有Shadowing机制,即允许使用新变量隐藏旧变量,通常用于需要对旧变量进行处理的场景 。这样子不用修改变量名,并且避免使用mut来修改变量,可以使得代码更加清晰

  4. 这里read_line 方法返回了一个io::Result<usize> 类型,是一个泛型枚举类型:{Ok,Err},用于错误处理。如果返回了Result 则必须要进行处理,这里用了expect方法进行处理(很严格,这也是为什么Rust比较安全)。 image.png

  5. Rust用match替代了switch,它比swtich更加强大,可以匹配 常量、变量、范围、复合类型(元组、数组)、结构体、枚举。 用match可以进行更加详细的错误处理,因为Result就是一个枚举类型{Ok,Err}