当前位置: 首页 > news >正文

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文件,并覆盖之前的内容。

相关文章:

  • Qt for Android代码中输出日志
  • Kubernetes群集调度
  • 基于ASP.NET MVC + Bootstrap的仓库管理系统
  • Ubuntu20.04下安装Redis环境
  • ElasticSearch集群架构实战及其原理剖析
  • 前端埋点方式
  • C++中浅复制及其存在的问题
  • Python 代码格式化工具YAPF 0.17.0问世
  • C++类和对象(七)const成员 及其初始化列表
  • Pytorch图像模型转ONNX后出现色偏问题
  • Visual Studio 2010 软件安装教程(附下载链接)——计算机二级专用编程软件
  • 虽然许多人表示对Windows 11的透明任务栏不满,但有时效果还是挺好的
  • uni-app小程序使用vant
  • 虚拟机VirtualBox添加磁盘
  • React——简便获取经纬度信息
  • 2017-08-04 前端日报
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++11: atomic 头文件
  • MySQL用户中的%到底包不包括localhost?
  • PV统计优化设计
  • Python实现BT种子转化为磁力链接【实战】
  • ubuntu 下nginx安装 并支持https协议
  • vue-cli3搭建项目
  • 计算机常识 - 收藏集 - 掘金
  • 聊聊redis的数据结构的应用
  • 驱动程序原理
  • 时间复杂度与空间复杂度分析
  • 用Visual Studio开发以太坊智能合约
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 仓管云——企业云erp功能有哪些?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何在招聘中考核.NET架构师
  • ​渐进式Web应用PWA的未来
  • #pragam once 和 #ifndef 预编译头
  • (C语言)字符分类函数
  • (六)vue-router+UI组件库
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)图像的%2线性拉伸
  • (五)Python 垃圾回收机制
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net refrector
  • .NET 的程序集加载上下文
  • .NET 反射的使用
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET关于 跳过SSL中遇到的问题
  • .NET是什么
  • @GlobalLock注解作用与原理解析
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [Assignment] C++1
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件