今天就直接上难度了,不过我们有教程不怕。先理解完事之后慢慢消化。。。直接用cargo创建一个项目,来吧展示:
cargo new guessing_game
cd guessing_game
看下图还是我们熟悉的目录结构:
我们这里就不再编译运行了,打印出来还是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 和 Err,Ok 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且 Err 中包含有关操作失败的原因或方式的信息。
Result 类型的值,像其他类型一样,拥有定义于其实例上的方法。Result 的实例拥有 expect 方法。如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并输出当做参数传递给 expect 的信息。所以当 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 Result 实例的值是 Ok,expect 会获取 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 运行:
到这里我们的第一部分已经完成了,不过我们还需要生成一个保密的数字,用来校对用户输入的是否是那个值,如果是就成功,不是就失败。我们用在第二部分讲解。好了我们下次见,谢谢大家观看。