Rust第二天,编写一个猜数字游戏(第一部分)

98 阅读4分钟

今天就直接上难度了,不过我们有教程不怕。先理解完事之后慢慢消化。。。直接用cargo创建一个项目,来吧展示:

cargo new guessing_game
cd guessing_game

看下图还是我们熟悉的目录结构:

image.png

我们这里就不再编译运行了,打印出来还是Hello world.直接看代码喽。

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 函数是程序的入口点

println!("Guess the number!"); println!("Please input your guess.");

println! 是一个在屏幕上打印字符串的宏

let mut guess = String::new();

创建一个 变量variable)来储存用户输入

let apples = 5;

这行代码新建了一个叫做 apples 的变量并把它绑定到值 5 上。在 Rust 中,变量默认是不可变的,这意味着一旦我们给变量赋值,这个值就不可以再修改了

接受用户的输入 我们在程序的第一行使用 use std::io; 从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin,这允许我们处理用户输入

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

如果程序的开头没有使用 use std::io; 引入 io 库,我们仍可以通过把函数调用写成 std::io::stdin 来使用该函数。stdin 函数返回一个 std::io::Stdin 的实例,这是一种代表终端标准输入句柄的类型。

接下来,代码中的 .read_line(&mut guess) 调用了标准输入句柄上的 read_line 方法,以获取用户输入。我们还将 &mut guess 作为参数传递给 read_line 函数,让其将用户输入储存到这个字符串中。read_line 的工作是,无论用户在标准输入中键入什么内容,都将其追加(不会覆盖其原有内容)到一个字符串中,因此它需要字符串作为参数。这个字符串参数应该是可变的,以便 read_line 将用户输入附加上去。

& 表示这个参数是一个 引用reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。现在,我们只需知道它像变量一样,默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess

.expect("Failed to read line");

它仍是逻辑行(虽然换行了但仍是语句)的一部分。后一部分是这个方法(method). read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。Result 是一种枚举类型,通常也写作 enum,它可以是多种可能状态中的一个。我们把每种可能的状态称为一种 枚举成员 Result 的成员是 Ok 和 ErrOk 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。

Result 类型的值,像其他类型一样,拥有定义于其实例上的方法。Result 的实例拥有 expect 方法。如果 io::Result 实例的值是 Errexpect 会导致程序崩溃,并输出当做参数传递给 expect 的信息。所以当 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Okexpect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。

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

这行代码现在打印了存储用户输入的字符串,下面举个例子来快速理解上面这块代码:

let x = 5;
let y = 10;

println!("x = {x} and y + 2 = {}", y + 2);

打印结果为x = 5 and y + 2 = 12. 让我们来测试下猜数字游戏的第一部分。使用 cargo run 运行:

image.png 到这里我们的第一部分已经完成了,不过我们还需要生成一个保密的数字,用来校对用户输入的是否是那个值,如果是就成功,不是就失败。我们用在第二部分讲解。好了我们下次见,谢谢大家观看。