rust入门基础案例:猜数字游戏

这篇具有很好参考价值的文章主要介绍了rust入门基础案例:猜数字游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

案例出处是《Rust权威指南》,书中有更加详细的解释。从这个例子中,我们可以了解到 rust 的两个操作:

  1. 如何从控制台读取用户输入
  2. rust 如何生成随机数

代码格式化

编译器可在保存时对代码做格式化处理,底层调用 rustfmt 来实现,代码内容基本和书中内容一致。代码中使用 use 语句显示的导入了标准库 std 中的 iocmp 包,因为 rand包并不在标准库中,所以,我们在 dependencies 声明中引入 rand 包。

use rand::Rng;
use std::{cmp::Ordering, io};

fn main() {
    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        let mut guess = String::new();
        io::stdin()
            .read_line(&mut guess)
            .expect("failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(err) => {
                println!("parse error: {err}");
                continue;
            }
        };

        match guess.cmp(&secret_number) {
            Ordering::Equal => {
                println!("success");
                break;
            }
            Ordering::Greater => println!("too big"),
            Ordering::Less => println!("too small"),
        }
    }
}

从控制台读取输入

io::stdin() 中的::语法声明stdin是io类型的一个关联函数,rust 会针对类型本身来定义函数,而不是针对某个特定实例,同样还有 String::new() 方法调用。

read_line 将控制台输入的内容存储到传入的参数中,同时返回 io::Result 类型值。这个类型属于枚举类型,rust 主要用来做错误处理。

生成随机数

针对 dependencies 中 rand 包的声明,rust 按照标准的语义化版本来处理版本号。版本声明中的 0.3.14实际上是^0.3.14的一个简写,它表示“任何与0.3.14版本公共API相兼容的版本”

[dependencies]
rand = "0.3.14"

程序最终使用的 rand 版本会记录在 Cargo.lock 文件中,通过 Cargo.lock 中详细的版本依赖信息,才保证了我们任何时候编译的结果都是相同的。除第一次构建程序外,再次构建程序时,Cargo 会优先检查 Cargo.lock,假如文件中存在已经指明具体版本的依赖库,那么它就会跳过计算版本号的过程,并直接使用文件中指明的版本。这使得我们拥有了一个自动化的、可重现的构建系统。

下面记录了 Cargo.lock 中记录了项目依赖的 rand 包详细信息:

rust入门基础案例:猜数字游戏,rust 编程开发,rust,开发语言

当你确实想要升级某个依赖包时,Cargo提供了一个专用命令:update,它会强制Cargo忽略Cargo.lock 文件,并重新计算出所有依赖包中符合Cargo.toml 声明的最新版本。假如命令运行成功,Cargo就会将更新后的版本号写入Cargo.lock文件,并覆盖之前的内容。

cargo doc

这里推荐另一个指令 : cargo doc --open,前面的例子中有讲到 rustup doc,cargo doc 会本地构建一份项目依赖的文档,并自动在浏览器中打开供你查看。

对于自动生成的依赖文档,我们期待里面直接包含了 rand、io、cmp 的 API 说明,至少包含 dependencies 中明确声明的依赖包。但生成的文档中,可能只包含了 guess 这一个主包的文档,压根不符合我们的预期。

我们通过它的属性列表来一一试探一下:

rust入门基础案例:猜数字游戏,rust 编程开发,rust,开发语言

  • cargo doc 生成的文档依赖 manifest 文件中声明的 workspace,manifest 指代项目的 Cargo.toml 文件,当前项目的 manifest 中并没有声明 workspace 区块。 查看 workspace 的使用文档,主要是定义项目内存在多个自定义包的情况,rand、cmp 不再这个范围内,所以属性 ----workspace 没有什么效果。
  • cargo doc --package 'rand@0.3.23' --open 通过属性 package 明确指定了文档中的包名,浏览器正常的输出了 rand 包的 API。

rust入门基础案例:猜数字游戏,rust 编程开发,rust,开发语言

方法 gen_range 生成的随机数包含下限不包含上限,所以代码中指定了1和101来获取1到100间的随机整数。

正常生成伪随机数都需要初始化 seed,如果不做初始化,每次生成的随机数都是相同的。thread_rng 方法内部把 seed 的封装了。如果使用相同的对象会生成相同的随机数吗?下面的代码最终生成的 3 个变量是不相同的。

 let thread_rng = rand::thread_rng();
 let secret_number = thread_rng.clone().gen_range(1, 101);
 let secret_number_1 = thread_rng.clone().gen_range(1, 101);
 let secret_number_2 = thread_rng.clone().gen_range(1, 101);
 println!("{}-{}-{}", secret_number, secret_number_1, secret_number_2);

类型转换

代码中将字符串类型转换为 u32 类型,这种字符串类型转换的方式直接通过类型声明来实现。而且,guess 变量也是重新声明的 u32 类型,隐藏了之前字符串类型的变量。

let guess: u32 = match guess.trim().parse()

下面给变量 x 重新赋值,rust 编译会报错:cannot mutate immutable variable,不可以对不可变量进行修改。侧面说明,x 属于不可变量。

fn main() {
    let x: i32 = 5;
    x = 6;
}

下面通过 let 重新声明变量的方式模拟实现了重新赋值,但实际上,第一个变量只是被第二个变量掩藏了。这个过程中,let 其实是创建了新的变量,所以,我们可以在复用变量名称的同时,修改它的类型。文章来源地址https://www.toymoban.com/news/detail-742495.html

fn main() {
    let x: i32 = 5;
    let x: u32 = 6;
}

总结

到了这里,关于rust入门基础案例:猜数字游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust编程语言入门之无畏并发

    Concurrent:程序的不同部分之间独立的执行(并发) Parallel:程序的不同部分同时运行(并行) Rust无畏并发:允许你编写没有细微Bug的代码,并在不引入新Bug的情况下易于重构 注意:本文中的”并发“泛指 concurrent 和 parallel 在大部分OS里,代码运行在进程(process)中,OS同时

    2023年04月19日
    浏览(70)
  • 初学编程入门基础教学视频,中文编程开发语言工具箱之豪华编辑构件,免费版中文编程软件下载

    初学编程入门基础教学视频,中文编程开发语言工具箱之豪华编辑构件,免费版中文编程软件下载  构件的其中一个属性、方法,查找内容,替换内容。 构件工具箱非常丰富,其中该构件在 文本件构件板菜单下。 编程系统化课程总目录及明细,零基础学中文编程视频教程,

    2024年02月07日
    浏览(81)
  • Rust编程语言入门之函数式语言特性:-迭代器和闭包

    闭包(closures) 迭代器(iterators) 优化改善 12 章的实例项目 讨论闭包和迭代器的运行时性能 闭包:可以捕获其所在环境的匿名函数。 闭包: 是匿名函数 保存为变量、作为参数 可在一个地方创建闭包,然后在另一个上下文中调用闭包来完成运算 可从其定义的作用域捕获值

    2023年04月08日
    浏览(45)
  • 【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁

    Rust是一种以安全性和高效性著称的系统级编程语言,具有出色的性能和内存安全特性。然而,在现实世界中,我们很少有项目是完全用一种编程语言编写的。通常,我们需要在项目中使用多种编程语言,特别是在与现有代码库或底层系统交互时。为了实现跨语言的互操作性,

    2024年02月15日
    浏览(54)
  • Rust编程语言入门之cargo、crates.io

    通过 release profile 来自定义构建 在https://crates.io/上发布库 通过 workspaces 组织大工程 从 https://crates.io/来安装库 使用自定义命令扩展 cargo release profile: 是预定义的 可自定义:可使用不同的配置,对代码编译拥有更多的控制 每个 profile 的配置都独立于其它的 profile cargo 主要的

    2023年04月09日
    浏览(55)
  • 中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程

    中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程 学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法 可以达到事半功倍的效果。对于初学者,可以通过下面的

    2024年02月08日
    浏览(85)
  • 【GO】go语言入门实战 —— 猜数字游戏

    程序介绍 首先生成一个介于1~100之间的随机数,然后提示玩家输入数字,并告诉玩家是猜对了还是猜错了,如果对了程序就结束,如果错了就提醒玩家是大了还是小了,然后玩家继续输入。 设置随机数 rand.Seed(seed int64) :播种 seed 为随机数种子 func time.Now() time.Time :获取当前

    2024年02月15日
    浏览(42)
  • Rust编程语言入门之最后的项目:多线程 Web 服务器

    在 socket 上监听 TCP 连接 解析少量的 HTTP 请求 创建一个合适的 HTTP 响应 使用线程池改进服务器的吞吐量 优雅的停机和清理 注意:并不是最佳实践 创建项目 main.rs 文件 修改一: 修改二: 修改三: 修改四: 修改五: hello.html 文件 404.html 文件 单线程Web服务器 开启线程 lib.r

    2023年04月25日
    浏览(57)
  • Rust语言从入门到入坑——(2)Rust在windows上搭建开发环境

    开始搭建一个适合在windows上运行的Rust环境。 Rust支持的程序语言很多:可详见官网介绍 本文章主要是在windowns下搭建开发环境 首先,需要安装最新版的 Rust 编译工具和 Visual Studio Code。 Rust 编译工具:https://www.rust-lang.org/zh-CN/tools/install Visual Studio Code:https://code.visualstudio.com

    2024年02月09日
    浏览(52)
  • 【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包