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 包详细信息:

在这里插入图片描述

当你确实想要升级某个依赖包时,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 这一个主包的文档,压根不符合我们的预期。

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

在这里插入图片描述

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

在这里插入图片描述

方法 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 其实是创建了新的变量,所以,我们可以在复用变量名称的同时,修改它的类型。

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

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes Dashboard 用户名密码方式登录

Author:rab 前言 为了 K8s 集群安全,默认情况下 Dashboard 以 Token 的形式登录的,那如果我们想以用户名/密码的方式登录该怎么操作呢?其实只需要我们创建用户并进行 ClusterRoleBinding 绑定即可,接下来是具体的操作…

MCU常见通信总线串讲(二)—— RS232和RS485

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言一…

低代码工具的常见用例与受众市场

目录 一、低代码工具的常见用例是什么? 1.业务流程管理(BPM) 2.自定义应用程序开发 3.数据管理和分析 4.移动应用程序开发 二、低代码受众和市场 1.制造商 2.个人开发者/自由职业者 3.代理商 4.小型企业和初创企业 5.中型企业 6.营销团队 7.软…

服务号怎么改成订阅号

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?在推送频率上来看,服务号每月能推送四条消息,而订阅号可以每天(24小时)推送一条消息。如果企业开通公众号的目的是提供服务,例如售前资讯…

GD32单片机远程升级下载,手机在线升级下载程序,GD32在线固件下载升级,手机下载程序固件方法

GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统B…

SpringBoot文件上传

SpringBoot文件上传 上传文件是互联网中常常应用的场景之一&#xff0c;最典型的情况就是上传头像等&#xff0c;今天就带着带着大家做一个 Spring Boot 上传文件的小案例。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…

【NI-DAQmx入门】NI-DAQmx之MATLAB/SIMULINK支持

Data Acquisition Toolbox™ 提供用于配置数据采集硬件、将数据读入 MATLAB 和 Simulink 以及将数据写入 DAQ 模拟和数字输出通道的应用程序和函数。该工具箱支持多种 DAQ 硬件&#xff0c;包括来自 National Instruments™ 和其他供应商的 USB、PCI、PCI Express 、PXI 和 PXI…

torch.cuda.is_available()=false的原因

1、检查是否为nvidia显卡&#xff1b; 2、检查GPU是否支持cuda; 3、命令行cmd输入nvidia-smi&#xff08;中间没有空格&#xff09;&#xff0c;查看显卡信息&#xff0c;cuda9.2版本只支持Driver Version>396.26&#xff1b;如果小于这个值&#xff0c;那么你就需要更新显…

详解--Hash(中文也称散列、哈希)

参考链接 参考链接2 1. hash 概念 1.1 什么是 hash Hash 也称散列、哈希&#xff0c;对应的英文都是 Hash。 基本原理就是把任意长度的输入&#xff0c;通过 Hash 算法变成固定长度的输出。这个映射的规则就是对应的 Hash 算法&#xff0c;而原始数据映射后的二进制串就是哈希…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手机上的某雅软件和某音乐软件点进去…

微信图片变小kb电脑怎么改?手机图片压缩的方法

平时在使用微信发送图片的时候&#xff0c;如果图片太大超出了平台限制是无法顺利发送的&#xff0c;很多小伙伴都不知道怎么处理这样的情况&#xff0c;其实可以直接使用压缩图的图片压缩来处理&#xff0c;打开浏览器就能直接完成微信图片压缩&#xff0c;在图片压缩大小时&a…

x264交叉编译(ubuntu+arm)

1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压&#xff1b;复制到ubuntu&#xff1b; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…

大数据管理平台有什么用?如何利用大数据管理平台优化企业运营?

在数字化时代&#xff0c;大数据管理平台已经成为了企业和组织不可或缺的工具。它不仅可以帮助企业跟踪和解决报修问题&#xff0c;还为数据分析提供了丰富的信息。通过合理利用大数据管理平台进行数据分析&#xff0c;企业可以更好地了解其运营情况&#xff0c;优化设备维修和…

【数据结构】败者树的建树与比较过程

文章目录 前置知识归并段 建树过程比较过程疑问为什么比较次数减少了&#xff1f;如果某个归并段的元素一直获胜&#xff0c;没有元素了怎么办&#xff1f;处理方法 1处理方法 2 前置知识 归并段 外部排序算法通常用于处理大规模数据&#xff0c;其中数据量远超过计算机内存的…

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

Netty入门指南之NIO Channel详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言Channe…

‘vite‘ is not recognized as an internal or external command

标题翻译后就是&#xff1a;‘vite‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文 运行一个由 Vite 构建的 Vue3 项目&#xff0c;之前还好好的能正常跑&#xff0c; 但拉取新代码之后再次执行 npm run dev 就提示 ‘vite’ 不是内部或外部命令&#xff0…

vue 实现在线预览Excel-LuckyExcel/LuckySheet实现方案

一、准备工作 1. npm安装 luckyexcel npm i -D luckyexcel 2.引入luckysheet 注意&#xff1a;引入luckysheet&#xff0c;只能通过CDN或者直接引入静态资源的形式&#xff0c;不能npm install。 个人建议直接下载资源引入。我给你们提供一个下载资源的地址&#xff1a; …

【NeurIPS 2020】基于蒙特卡罗树搜索的黑箱优化学习搜索空间划分

Learning Search Space Partition for Black-box Optimization using Monte Carlo Tree Search 目标&#xff1a;从采样&#xff08;Dt ∩ ΩA&#xff09;中学习一个边界&#xff0c;从而最大化两方的差异 先使用Kmeans在特征向量上&#xff08; [x, f(x)] &#xff09;聚类…

20231107-前端学习炫酷菜单效果和折叠侧边栏

炫酷菜单效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>炫酷菜单效果</title><…