从一个猜数游戏开始

标题

  • 一、从源码中学习
    • 1.1 源码
    • 1.2 运行结果
  • 二、 导入一个trait
  • 三、重要源码分析

一、从源码中学习

1.1 源码

一个简单的猜数大小游戏,不集的输入,直到猜测正确时退出。

use rand::Rng;
use std::cmp::Ordering;
use std::io;

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

    // println!("神秘数字是: {}", secret_number);

    loop {
        println!("猜测一个数[1,100]:");

        let mut guess = String::new();
        //把输入放到guess字符串中
        io::stdin().read_line(&mut guess).expect("无法读取行");

        let guess: u32 = match guess.trim().parse(){
            Ok(num1) => num1,
            Err(message) => {
                println!("错误: {message}!");
                continue;
            }
        };

        // println!("您猜测的数是: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("太小了!"),
            Ordering::Greater => println!("太大了!"),
            Ordering::Equal => {
                println!("赢麻了_^_!");
                break;
            }
        }
    }
}

1.2 运行结果

在这里插入图片描述

二、 导入一个trait

该程序需要引用第三方随机数库,打开Cargo.toml文件,在[dependencies]下添加一行rand = "0.3.14",也可以写成rand = ^0.3.14,前者是后者的简写,表示任何至少是 0.3.14 但小于 0.4.0 的版本。

三、重要源码分析

  1. 类似于python中的import导入第三方包,Rust需要使用use导入它所需要使用的随机数Ordering枚举以及io操作库。
use rand::Rng;
use std::cmp::Ordering;
use std::io;
  1. Rng 是一个 trait,它定义了随机数生成器应实现的方法,代码中调用了rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取种子,接着调用随机数生成器的 gen_range 方法,可以使用start..=end的方式来包含上下端,也可以使用代码中的方式,两者都表示生成[1,100]中的随机数。
let secret_number = rand::thread_rng().gen_range(1, 101);
  1. Rust使用let定义变量,默认的变量为不可变变量,例如下面的语句会报错
let x = 1;
x = 3;  //Error: cannot assign twice to immutable variable

要解决这个问题,需要添加mut关键字

let mut x = 1;
x = 3;   //Right
  1. 由于需要向一串表示字符串的地址中写入数据,因此将指向该地址的变量定义为mut类型,使用String::new()申请一串地址空间,该空间是一个UTF8编码的可增长文本块,可以将该函数理解成c++中的静态方法。
  2. 从标准输入(键盘,即stdin)中读取字符串并存入申请的内存地址中,注意:read_line的工作原理是:无论用户在标准输入中输入什么内容,都会追加到一个字符串中,因此不能把String::new()函数写到loop外面,因为这样写会每次都追加数据(包括回车符),导致程序出错
  3. 从键盘输入的为字符串,因此要使用let guess: u32强制将输入的字符串转换为32位无符号整数,以此与生成的整数进行比较。
  4. trim()取消输入字符两边的空格和换行符,parse()转换为整数,如果转换成功返回Ok和最终的值,否则返回Err和错误信息,因此将返回值进行处理。
 let guess: u32 = match guess.trim().parse(){
       Ok(num1) => num1,
       Err(message) => {
           println!("错误: {message}!");
           continue;
       }
   };
  1. 最后将输入的值与生成的值进行对比分析,指引用户逐渐输入正确的值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解锁自动化文档转换:Python-Markdown的魔法

文章目录 解锁自动化文档转换:Python-Markdown的魔法背景Python-Markdown是什么?如何安装Python-Markdown?Python-Markdown库函数使用方法场景应用示例常见问题与解决方案总结 解锁自动化文档转换:Python-Markdown的魔法 背景 在…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 买卖股票的最佳时机含冷冻期(难度⭐⭐)(79)

1. 题目解析 题目链接:309. 买卖股票的最佳时机含冷冻期 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 二、算法思路 1. 状态表示 dp[i][0]:表示第 i 天结束后,处于「买入」状态…

总结2024.6.2

最近,还没受到offer,找工作找到自闭。在找工作的过程中,也听到一些面试官问我的职业生涯规划。这也让我陷入了沉思。自从考研结束后,都是被这个社会推着走的。我当初也想过自己要从事什么工作,不过,后面还是…

Mysql常见问题总结

1、MySQL初始化报错 mysqld --initialize --usermysql --console 2024-06-02T15:52:22.645557Z 0 [System] [MY-013169] [Server] D:\installSoft\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 8980 2024-06-02T15:52:2…

向量叉乘的方向

向量叉乘的方向 最近在百度上看到这样一个帖子: 可以根据这个判断是顺时针还是逆时针的 ab的方向:四指由a开始,指向b,拇指的指向就是ab的方向,垂直于a和b所在的平面; ba的方向:四指由b开始&a…

驾校-短视频营销招生精品课:抖音推广技巧,抖音短视频招生(41节课)

课程下载:驾校-短视频营销招生精品课:抖音推广技巧,抖音短视频招生(41节课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载:关注我。 课程内容: 课程目录 [1]-第1课驾校为什么要全力做好短视频营销.mp4 …

Gorm入门

Gorm入门 声明:本博客为看李文周大佬gorm入门视频笔记 【GORM简明教程】关于GORM你看这一个就够了_哔哩哔哩_bilibili 我的代码仓库:6月/Gorm 沉着冷静/2023 - 码云 - 开源中国 (gitee.com) gorm介绍 安装库 go get -u github.com/jinzhu/gormgo ge…

拼图游戏完整思路(全代码演示)

主界面 小练习1: 一、三个界面的设置1:创建窗体 1、将三个主界面分开为三个类,每个类都去继承JFrame这个类,使得每个类都可以使用创建页面功能 2、对每个类进行空参构造,在空参构造里面进行窗体属性的赋值 3、创建一个…

JavaScript基础(十一)

String对象的方法 上一次说了String,那也少不了方法。 length 字符串长度 charAt(a) 返回指定位置的字符,(这里a代表下标,它返回的就是下标a对应的字符) concat(b) 连接字符串,b是被合并的对象名,和加号拼接一样…

创新指南|领导者如何评估自己的表现——麦肯锡专有的CEO卓越评估工具

CEO是任何组织中最具挑战性和要求最高的职位之一,尤其是在当前的经济环境下。这也是最重要的职位之一。研究表明,一家公司 45% 的业绩可归因于CEO的影响。但 CEO 们的实际表现如何?他们面临哪些问题?如何帮助他们发挥出最佳水平&a…

HALCON飞拍贴片机框架程序——硬件介绍

本专栏主要讲解三头贴片机框架程序,包括硬件介绍和软件代码。硬件主要为视觉部分,软件为视觉检测代码部分。贴片机的机械硬件不做介绍。 具体设备运行视频可以搜索博主抖Y:“伶俐科技”观看。 贴片机硬件如下图分为三个部分,第一…

了解Maven,并配置国内源

目录 1.了解Maven 1.1什么是Maven 1.2快速创建一个Maven项⽬ 1.3Maven 核⼼功能 1.3.1项⽬构建 1.3.2依赖管理 1.4Maven Help插件 2.Maven 仓库 2.1中央仓库 2.2本地仓库 3.Maven 设置国内源 1.查看配置⽂件的地址 2.配置国内源 3.设置新项⽬的setting 1.了解Ma…

Ubuntu22.04之安装星火应用商店《兼容windows应用》(二百三十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试6月2日预测第9弹

今天继续基于8883的大底进行测试,今天继续测试,好了,直接上结果吧~ 首先,888定位如下: 百位:5,4,7,3,2,9,1,0 十位:4,6,5,7,2,9,1,0 个位:3,4,2,5,…

BIT 2024 编译原理 Lab. 4 四代编译器实验说明和要求

实验四:四代编译器实验 一、实验要求 详细实验要求请参考文件《Lab4实验说明和要求.pdf》。 二、实验思路 1、与 lab3 的对比 如果你在 lab3 就已经像我一样单独写了个函数处理表达式,那么理论上,lab4 相比于 lab3,不过就是多…

Ubuntu server 24 (Linux) IPtables 双网卡 共享上网NAT 安装配置DHCP

一 开启路由转发功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安装DHCP #更新软件包列表: sudo apt update #安装DHCP服务器 sudo apt install isc-dhcp-server #修改监听网卡,根据实际修改 sudo vi /etc/default/isc-dhcp-server …

HTML+CSS 文本动画卡片

效果演示 实现了一个图片叠加文本动画效果的卡片(Card)布局。当鼠标悬停在卡片上时,卡片上的图片会变为半透明,同时显示隐藏在图片上的文本内容,并且文本内容有一个从左到右的渐显动画效果,伴随着一个白色渐…

15、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、plot()函数默认格式画图 代码: x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) 2、X轴和Y轴显示范围/axis()函数 代码: x0:0.1:20;%绘图默认格式 ysin(x); plot(x,y) axis([0 21 -1.1 1.1])%设置范围 3、网格显示/grid on函数 代码: …

c++ 继承多态详解

第一节:继承: 1,相关概念 父类,基类。子类,派生类 (1)基类的私有成员,派生类不可访问 (2)基类中被保护的成员再子类中可以被访问,但是在类外不可…

计算机毕业设计Hadoop+Spark+Hive知识图谱租房推荐系统 租房数据分析 租房爬虫 租房可视化 租房大数据 大数据毕业设计 大数据毕设 机器学习

毕 业 设 计(论 文) 基于大数据的租房数据爬虫与推荐分析系统 姓 名 学 院 专 业 班 级 指导教师 摘 要 本设计是一个基于爬虫技术的房地产数据采集与可视化分析应用程序。该程序首先通过爬虫采集网上所有房地产的房源数据…