Rust实例学习(猜数字游戏)

本文详细介绍了如何使用Rust实现一个猜数字游戏。涵盖了从创建新项目、处理用户输入、生成随机数、比较数字到实现循环猜数的整个流程。涉及Rust中的let、match、方法、关联函数、外部crate等概念,特别是如何使用rand crate生成随机数。
摘要由CSDN通过智能技术生成

使用Rust实现一个经典的新手编程问题:猜数字游戏。
本节涉及Rust中的let、match、方法、关联函数、外部 crate 等知识
程序运行逻辑:程序将会随机生成一个 1 到 100 之间的随机整数。接着它会请玩家猜一个数并输入,然后提示猜测是大了还是小了。如果猜对了,它会打印祝贺信息并退出

准备一个新项目

创建一个新项目,选择一个目录,使用 Cargo 新建一个项目,如下:

$ cargo new guessing_game
$ cd guessing_game/
  • 命令解释

第一个命令,cargo new,它获取项目的名称(guessing_game)作为第一个参数。
第二个命令,进入到新创建的项目目录。

审查生成的 Cargo.toml 文件

文件名: Cargo.toml

[package]
name = "guessing_game"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
edition = "2018"

[dependencies]

如果 Cargo 从环境中获取的开发者信息不正确,修改Cargo.toml并再次保存。

处理一次猜数字

获取用户猜测并打印

猜数字程序的第一部分是请求和处理用户输入,并检查输入是否符合预期的格式。
首先,允许玩家输入猜测。
文件名: src/main.rs

use std::io;

fn main() {
   
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}

代码解释
use std::io; 为了获取用户输入并打印结果作为输出,我们需要将 io(输入/输出)库引入当前作用域。io 库来自于标准库(也被称为 std)
fn main() { main 函数是程序的入口点,fn 语法声明了一个新函数,() 表明没有参数,{ 作为函数体的开始。
println!的两行只是打印,没有太多含义
接下来就是这段代码的重点:使用变量储存值
let mut guess = String::new();这条语句创建了一个存储用户输入的地方,注意这是一个 let 语句,用来创建 变量(variable),例如let foo = bar; //新建了一个叫做 foo 的变量值为 bar
mut则是代表可变变量 ,其实就是(Mutability)的缩写

let foo = 5; // 不可变
let mut bar = 5; // 可变

现在我们知道了 let mut guess 会引入一个叫做 guess 的可变变量。等号(=)的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。String 是一个标准库提供的字符串类型,它是 UTF-8 编码的可增长文本块。
:: 语法表明 new 是 String 类型的一个 关联函数(associated function)。关联函数是针对类型实现的,在这个例子中是 String,而不是 String 的某个特定实例。一些语言中把它称为 静态方法(static method)。
new 函数创建了一个新的空字符串,你会发现很多类型上有 new 函数,因为它是创建类型实例的常用函数名。
总结一下,let mut guess = String::new(); 这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。
接下来的两行是关于输入/输出功能
回到开头,在程序的第一行使用了 use std::io;
现在的这两行就是调用 io 库中的函数 stdin

    io::stdin()
        .read_line(&mut guess)

如果程序的开头没有写 use std::io 这一行,也可以把函数调用写成 std::io::stdin。stdin 函数返回一个 std::io::Stdin 的实例,这代表终端标准输入句柄的类型
第二行,.read_line(&mut guess),调用 read_line 方法从标准输入句柄获取用户输入。我们还向 read_line() 传递了一个参数:&mut guess。
read_line 的职责是,无论用户在标准输入中键入什么内容,都将其存入一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。
& 表示这个参数是一个 引用(reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess使其可变,而不是 &guess。
接下来的一行是关于处理错误,需要注意,虽然这是单独一行代码,但它是一个逻辑行(虽然换行了但仍是一个语句)的第一部分
.expect("Failed to read line");
或者结合之前的两行写成

io::stdin().read_line(&mut guess).expect("Failed to read line");

因为行过长会导致代码可读性降低,所以最好拆开来写
之前提到了 read_line 将用户输入附加到传递给它的字符串中,不过它也返回一个值——在这个例子中是 io::Result。Rust 标准库中有很多叫做 Result 的类型:一个通用的 Result 以及在子模块中的特殊版本,比如 io::Result
Result 类型是 枚举(enumerations),通常也写作 enums。枚举类型持有固定集合的值,这些值被称为枚举的 成员(variants)
Result 的成员是 OkErrOk 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且包含失败的前因后果。
这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。io::Result 的实例拥有 expect 方法。如果 io::Result实例的值是 Err,expect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值