一起长锈:3 类型安全的Rust宏(从Java与C++转Rust之旅)

发布于:2024-05-07 ⋅ 阅读:(25) ⋅ 点赞:(0)

讲动人的故事,写懂人的代码

  • 故事梗概:
  • 在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;
  • 然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而不至被裁员,她必须领会编程如何"快速"才能有真正的意义。

上次聊到,Java程序员赵可菲和C++程序员席双嘉在Rust大神贾克强的带领下,找到了AI编程小助手艾极思把Rust编程书中的游戏需求改成了“猜骰子冷热”,现在得重新写一遍代码了。

他们用 cargo new 命令开了个新的Rust项目,并且把Cargo.lock文件也上传到版本库去了。

下一步,就是要开始为“猜骰子冷热”游戏写代码了。

3.1 列出“猜骰子冷热”游戏的用户故事

赵可菲:“在这个AI写代码的时代,最快的写代码方式就是告诉艾极思你的需求,然后让它帮你写。”

席双嘉:“这主意不错哦!但是我们才刚开始学Rust,艾极思如果直接给我们一大堆最后的代码,我们可能会一头雾水。”

“要不我们按照书上的方法,把游戏的需求分成一些小的用户故事。一点一点来学习。”

赵可菲点点头。

他们两个列出了“猜骰子冷热”游戏的7个用户故事,改编自Guessing Game的故事:

1 获取玩家猜的两个骰子点数之和并显示给玩家 2 生成两个骰子点数之和的随机答案 3 比较答案与玩家猜的点数之和 4 将玩家猜的点数之和字符串转换为数字以便比较 5 允许玩家在没猜对后继续猜 6 玩家在猜对后程序退出 7 玩家的输入若不是数字,则继续猜

赵可菲照着书上的代码,写出了故事1“获取玩家猜的两个骰子点数之和并显示给玩家”的代码:

use std::io;

fn main() {
    println!("Guess the sum of two dice!");

    println!("Please input your guess (between 2 and 12).");

    let mut guess = String::new();

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

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

3.2 自动加载标准库的prelude

贾克强:“我来考考你们。这段代码里,哪些是用了prelude的标准库?哪些又得自己use标准库呢?”

席双嘉:“书上说,io::stdin()不在prelude里,得用use std::io自己来use。”

“但是,哪些用了prelude的标准库,我就不知道了。”

赵可菲一边翻书一边说:“prelude是啥来着?”

贾克强:“Rust的标准库功能多得很。但是,如果每个功能都得手动use,那就太麻烦了。同样,use一堆你根本不用的功能也不妥。所以,要找个平衡。”

prelude就是Rust自动use到每个Rust程序的功能清单。它尽量保持简洁,主要关注那