2025年1月6日更新:我在文章末尾加了 GitHub 链接。我会继续边玩边从这个程序里学习。
如果你关注过我的文章,你会发现我写了许多针对初学者的 Rust 编程语言的内容。这是我尝试用文字和想法表达自己对当前话题的理解,以便日后参考。这些内容可能不总是非常完整或提供最佳视角,但它可以补充我在其他地方学习的内容。
他们说说到底,理解某件事情最好的方式就是试着向别人解释它。我两年前写下的所有内容,到现在为止都已经在这里发布了。我把它搬到了一个可能触及更多人的平台上。说实话,到了2022年,免费互联网已经死了……到了2025年,情况更加糟糕。如果你不在某个精选的内容平台上,你基本上就等于隐形了。
在这方面,我正在加倍关注基础知识。我大约两年前开始读《The Rust Book》(https://doc.rust-lang.org/book/title-page.html),却从未读完。我发现它有点......晦涩难懂。书中缺乏贴近生活的具体示例,因此我很难从中学习。我这种学习者需要动手来做。对我来说,抽象概念的意义不大,除非我主动尝试去实现一些实际的东西。
不幸的是,这种倾向让我忽视基础部分,因为它们本身并不吸引我(可以理解吗?)。我总是急于求成,还没有学会走就开始跑,寻找某个东西或某个项目,通常远远超出了我的能力范围。随着时间的推移,通过不断重复,这些知识才逐渐被我掌握。
我觉得这有点像学习障碍,我知道对自己太苛刻了。我最大的愿望是能学会放慢脚步,享受理解基础知识的乐趣。
我还是不会有什么太大的改变。最好还是顺其自然,别硬抗。
总之,别再自言自语了。我之前说过了,我是在2025年回到了《The Rust Book》。昨天我完成了第二章,即作者指导你创建猜数字游戏的那一章。
今天我决定从记忆中完成,挑战自己。
基本上搞定,但有点磕磕绊绊。这里就是那个超级复杂设计的版本:
// src/main.rs
// 来自《The Rust Book》第二章的猜数字游戏项目
// 依赖包
use color_eyre::Result;
use rand::{thread_rng, Rng};
use std::cmp::Ordering;
use std::io::{stdin, stdout, Write};
// 输出消息函数
fn write_msg(msg: &str) -> Result<()> {
stdout().write_all(msg.as_bytes())?;
Ok(())
}
// 主函数:程序的入口点
fn main() -> Result<()> {
// 设置 color_eyre
color_eyre::install()?;
// 生成一个用户需要猜测的随机数(范围1到100)
let mut rng = thread_rng();
let number = rng.gen_range(1..=100);
// 游戏循环
loop {
// 用户输入
let msg = "请在1到100之间输入一个数字...\n";
write_msg(msg)?;
let mut guess = String::new();
stdin().read_line(&mut guess)?;
let msg = format!("你的猜测是: {}", guess);
write_msg(msg.as_str())?;
// 比较用户输入与随机数
let guess: i32 = guess.trim().parse()?;
match guess.cmp(&number) {
Ordering::Less => {
let msg = "太小了!\n";
write_msg(msg)?;
}
Ordering::Greater => {
let msg = "太大了!\n";
write_msg(msg)?;
}
Ordering::Equal => {
let msg = "你猜对了!恭喜你获胜!\n";
write_msg(msg)?;
break;
}
}
}
Ok(())
}
进入全屏 退出全屏
下面几点超出第二章介绍的内容:
- 使用 color_eyre 这个 crate 来进行错误处理。这个 crate 允许使用
?
操作符,简化了错误处理,并减少了你需要编写的样板代码。 - 没有使用宏……出于某些原因,我决定不使用宏,因为我希望理解底层原理。你会看到一个
write_msg()
函数,它接受一个字符串切片,并调用stdout()
函数来创建一个 stdout 的句柄,从而获得一个实现了 Write 特性的对象,这样我们就可以向控制台输出消息了。
除此之外,和第二章差不多。我曾想过把它做成某种API,但最终还是沿用了书里的方向。
这是一个非常基础的程序,但它强调了许多重要的 Rust 概念,并且是一个很好的开始。我在这里分享是因为想展示我的工作,也许能得到一些建设性的反馈,并且也许能帮助其他人踏上 Rust 的旅程。
晚安啦,感谢您的阅读!
参考资料