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

第二章-猜数游戏

猜数游戏

纸上得来终觉浅,绝知此事要躬行。实践才能出真知,因此本文内容将通过一个小项目快速帮我们上手Rust语言。其中可能会出现一些目前还不是很了解的知识,但没事,后续通过学习我们会慢慢了解的,现在我们先体会一下Rust的运用。

我们会实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。

第一步——读取用户输入并输出

我们使用cargo new guessing_game命令新建一个名为guessing_game的项目。

与上一篇文章类似,我们首先可以编写对用户输入的读取,并进行输出的功能代码:

use std::io;fn main() {println!("Guess the number!");println!("Please input your guess.");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("Failed to read line");println!("You guessed: {}", guess);
}

第6行代码表示创建了一个变量,其中mut表示该变量可变,若不加该关键字表示变量不可变。String是标准库提供的字符串类型,它属于prelude,因此无需显式引入。双冒号::表明newString的一个关联函数,通过new函数可以创建一个新的空字符串。

第7行中,io库中的stdin()可以使程序能够处理用户的输入。

第8行中,read_line()函数先接收了guess变量的引用,&就表示“引用”,它允许多处代码访问同一个数据,而无需在内存中多次拷贝。经过函数处理后会返回一个 Result 类型的结果,这个 Result 是一种枚举类型,枚举类型变量的值可能有多种可能的状态,我们把每种可能的状态称为一种枚举成员。Result 类型的枚举成员有OkErr两种,前者表示“操作成功”,并附带成功时产生的值;后者表示“操作失败”,且同样附带了操作失败的原因等信息。

第9行的expect()函数会接收 Result 类型的结果,如果是 Ok,则返回其值;如果是Err,则返回相应的内容。如果此处不加该函数去处理错误,Rust语言将不通过编译,这也能体现出Rust语言的安全性。

编写完第一部分的代码之后,运行一下结果:
在这里插入图片描述

顺利读取输入并返回结果!那现在开始第二部分。

第二步——生成随机数字

接下来需要实现随机数字的生成功能,这时候我们需要引入外部crate帮助我们实现这一功能。

此处我们要引入的是rand这个包,引入外部包有两种方法:

  1. 通过Cargo.toml文件进行添加:

在这里插入图片描述
此处表示引入 0.8.5 版本的rand包。

  1. 通过在命令行输入cargo add [包名]@[版本号]来添加外部包。

两个方法的效果均相同,并且在构建代码之后会生成一个Cargo.lock文件,这个文件可以保证任何人在构建这个代码时,只会使用指定的包版本,除非我们显式地升级版本。这有助于程序的“可重复构建”,因此它通常会和项目中地其余代码一样纳入到版本控制系统中。

引入包之后,我们就要利用它实现生成随机数字功能了。具体实现代码如下:

use rand::Rng;fn main(){println!("Guess the number!");let secret_number = rand::thread_rng().gen_range(1..101);......
}

在代码中,我们显式引入了rand::Rng,其中Rng是一个trait,它定义了随机数生成器应该实现的方法,类似 Java 中的接口。关于 trait,后续经过学习后会进行相应的补充。

在第5行,我们定义了一个变量(注意:这个变量是不可变的),通过rand::thread_rng()函数提供实际使用的随机数生成器,它位于当前执行线程的本地环境中,并从操作系统获取seed。接着调用随机数生成器的gen_range方法获取随机数。在gen_range方法中,我们使用了一个范围表达式作为参数来生成此范围内的随机数。范围表达式分为x..yx..=y两种,前者表示[x,y),后者表示[x,y]

多执行几次代码,可以看到随机数可以成功生成:

在这里插入图片描述

第三步——比较

现在有了用户输入和随机数,那么就可以比较二者实现猜数功能了。在这个步骤中将引入另一个外部包std::cmp::OrderingOrdering也是一个枚举类型,它有三个枚举成员:LessGreaterEqual。我们会使用match表达式,并利用cmp方法来比较用户输入和随机数,代码如下:

use std::cmp::Ordering;fn main(){......let secret_number = rand::thread_rng().gen_range(1..101);println!("Please input your guess.");let mut guess = String::new();......match guess.cmp(&secret_number) { // 报错Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => println!("You win!"),}
}

match表达式和switch语句非常类似,当符合某一个情况时,便会返回对应的内容。然而上述代码在编译阶段会报错,原因在于secret_numberguess这两个变量不是同一个数据类型,前者是整数类型,后者则是字符串。因此需要将二者的数据类型统一。

对此,可以添加如下代码:

fn main(){......let mut guess = String::new();......let guess: u32 = guess.trim().parse().expect("Please input number!");......
}

第4行中,我们定义了一个u32类型的guess变量,变量名后加冒号就代表显式声明变量的数据类型。相信有人也发现了,这里居然有两个同名变量。这也是Rust语言的特性,这种特性名为遮蔽(Shadowing),关于“遮蔽”的更多内容,在经过后面的学习会进行相应补充,此处只需知道这个特性常被用于将一个类型的值转换为另一个类型的值

在第4行的等式右边,我们分别用到了trim()parse()expect()方法。trim()方法用于去除字符串前后多余的空白;parse()用于将字符串转换成其他类型,因为前面已经告知了Rust,guess变量的类型为u32,因此经过parse()方法之后会得到一个整数类型的用户输入。由于parse()方法返回的是一个 Result 类型,因此需要一个方法处理错误。此处我们继续使用expect()方法进行处理。

而且Rust确实很聪明,当你定义guess变量为u32类型后,与其进行比较的secret_number也自动被赋为u32类型了

执行代码之后可以发现已经会反馈比较结果了,但是在猜了一次之后就停止了,这样体验感极差,因此需要让它保持循环,直到用户猜出数字。

在这里插入图片描述

第四步——引入循环进行多次猜测

loop关键字可以实现一个无限循环,将其加入到代码中实现无限循环,来让用户有更多机会猜出数字:

......
fn main(){......loop {println!("Please input your guess.");......match guess.cmp(&secret_number) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => println!("You win!"),}}
}

但这样面临一个问题,那就是无法跳出循环了。所以我们希望在用户猜对之后结束循环,因此上述代码将改为:

......
fn main(){......loop {println!("Please input your guess.");......match guess.cmp(&secret_number) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => {println!("You win!");break;},}}
}

同时,我们也不希望用户输入非数字类型的输入时使程序崩溃,从而让用户可以继续猜测,因此可以进行下述优化:

......
fn main(){......loop {println!("Please input your guess.");......let guess: u32 = match guess.trim().parse(){Ok(num) => num,Err(_) => continue,};......}
}

利用match表达式判断用户是否输入非数字类型输入,是的话输出数字,不是的话利用loop循环重新要求输入。

整体代码

经过了不断优化,最终得到实现代码:

use std::cmp::Ordering;
use std::io;
use rand::Rng;fn main() {println!("Guess the number!");let secret_number = rand::thread_rng().gen_range(1..101);loop {println!("Please input your guess.");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(_) => continue,}; println!("You guessed: {}", guess);match guess.cmp(&secret_number) {Ordering::Less => println!("Too small!"),Ordering::Greater => println!("Too big!"),Ordering::Equal => {println!("You win!");break;},}}
}

运行代码结果如图所示:

在这里插入图片描述

相关文章:

第二章-猜数游戏

猜数游戏 纸上得来终觉浅,绝知此事要躬行。实践才能出真知,因此本文内容将通过一个小项目快速帮我们上手Rust语言。其中可能会出现一些目前还不是很了解的知识,但没事,后续通过学习我们会慢慢了解的,现在我们先体会一…...

Go小技巧易错点100例(二十九)

随着 Go 语言的不断迭代,新版本带来了许多实用的标准库函数,使得代码更加简洁、可读性更强。本篇文章主要介绍 Go 1.21 版本中的一些新特性,涵盖 可变类型比较、slice 最大值与最小值、map 转换为 slice 以及 map 合并 等常见场景&#xff0c…...

游戏开发的TypeScript(5)TypeScript的类型转换

TypeScript的类型转换 游戏开发中,事件经常会携带一些数据,而这些数据会做类型上的转化,在 这种情况下,类型转换(Type Assertion)能够让你手动把某个值指定为特定类型。这在 TypeScript 无法自动推断出正确…...

旋转图像(中等)

借助辅助矩阵来翻转&#xff1a; 第i行第j列的元素会出现在新矩阵的第j行倒数第i列。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;int[][] matrix_new new int[n][n];for (int i 0; i < n; i) {for (int j 0; j < n; j) {matrix_ne…...

慢sql处理流程和常见案例

思维导图: 在 MySQL 数据库管理中&#xff0c;慢查询是影响系统性能的常见痛点。随着 MySQL 8 版本的普及&#xff0c;其新增特性&#xff08;如 CTE、隐藏索引、JSON 格式执行计划等&#xff09;为慢查询优化提供了更强大的工具。本文结合 MySQL 8 的特性&#xff0c;通过代码…...

Kubernetes控制平面组件:Controller Manager 之 内置Controller详解

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

E-R图作业

1.一个图书馆借阅管理数据库要求提供下述服务&#xff1a; &#xff08;&#xff11;&#xff09;可随时查询书库中现有书籍的品种、数量与存放位置。所有各类书籍均可由书号惟一标识。 &#xff08;&#xff12;&#xff09;可随时查询书籍借还情况&#xff0c;包括借书人单位…...

debuginfo详解

debuginfo 是 Linux 系统中存储调试符号和源代码信息的特殊软件包&#xff0c;用于分析内核或用户态程序的崩溃转储文件&#xff08;如 vmcore、coredump&#xff09;。它在调试复杂问题&#xff08;如内核崩溃、程序段错误&#xff09;时至关重要。以下是其核心作用、安装方法…...

Android学习总结之GetX库篇(场景运用)

状态管理 在一个复杂的 Flutter 应用里&#xff0c;怎样借助 GetX 管理多个相互关联的状态&#xff0c;并且保证代码的可维护性和性能&#xff1f; 考察点&#xff1a;对 GetX 状态管理的深入理解&#xff0c;以及在复杂场景下运用它的能力。 解答思路&#xff1a; 采用模块…...

android-ndk开发(5): 编译运行 hello-world

android-ndk开发(5): 编译运行 hello-world 2025/05/05 1. 概要 hello-world 是每一门语言的第一个样例程序&#xff0c; 跑通它&#xff0c; 在一段时间内你会相当顺畅&#xff1a; 可以边学边实验&#xff0c; 根据运行结果得到反馈。 而对于 android-ndk 开发而言&#…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.1 客户分群分析(RFM模型构建)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL数据分析实战&#xff1a;RFM模型构建实现客户分群分析6.1 客户分群分析——RFM模型构建6.1.1 RFM模型核心指标解析6.1.2 数据准备与清洗规范数据表结构设计数据清…...

stm32之TIM定时中断详解

目录 1.引入1.1 简介1.2 类型1.2.1 基本定时器1.2.2 通用定时器1. 触发控制单元 (Trigger Control Unit)2. 输入捕获单元 (Input Capture Unit)3. 输出比较单元 (Output Compare Unit)4. CNT 计数器5. 自动重装载寄存器 (ARR)6. 预分频器 (PSC)7. 中断与 DMA 事件8. 刹车功能 (…...

【Hive入门】Hive安全管理与权限控制:用户认证与权限管理深度解析

目录 引言 1 Hive安全管理体系概述 2 Hive用户认证机制 2.1 Kerberos集成认证 2.1.1 Kerberos基本原理 2.1.2 Hive集成Kerberos配置步骤 2.1.3 Kerberos认证常见问题排查 2.2 LDAP用户同步 2.2.1 LDAP协议概述 2.2.2 Hive集成LDAP配置 2.2.3 LDAP与Hive用户同步架构…...

解决DNS劫持问题

什么是DNS劫持&#xff1f; DNS劫持&#xff08;DNS Hijacking&#xff09;是指通过篡改DNS配置&#xff0c;将用户的域名解析请求引导到恶意服务器的攻击方式。这种攻击常见于恶意软件、路由器漏洞或DNS配置被修改的情况下。攻击者通过这种方式控制了用户访问的网站&#xff…...

android-ndk开发(1): 搭建环境

android-ndk开发(1): 搭建环境 2025/05/05 1. 目的 写一些 C/C 代码&#xff0c; 例如 cv 基础算法&#xff0c; 并交叉编译到 android 平台。 不涉及 JNI、 Java、 Kotlin&#xff0c; 暂不涉及 rust。 基本上能适用于华为鸿蒙的 ohos ndk。 那么&#xff0c; 为了完成交叉…...

力扣面试150题-- 翻转二叉树

Day 41 题目描述 做法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…...

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM(一)

一、前言 随着大语言模型的参数规模持续膨胀,如何在有限算力下实现高效推理成为行业焦点。阿里云推出的Qwen3-8B,凭借其卓越的语言理解与生成能力,已在多个基准测试中展现竞争力。而vLLM框架作为大模型部署的“加速器”,通过PagedAttention实现内存的高效管理,并支持连续批…...

brep2seq kaggle安装 micromamba conda环境

https://github.com/zhangshuming0668/Brep2Seq Micromamba Installation — documentation !curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba A Synthetic CAD Models Dataset for Deep Learning kaggle只有20g&#xff0c;等我有…...

钩子函数和参数:Vue组件生命周期中的自定义逻辑

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

SpringBoot企业级开发之【文件上传】

看一下我们的需求&#xff1a; 接口文档&#xff1a; 分析思路&#xff1a; 现在我们先实现后端先&#xff1a; 实操&#xff1a; 一.存储到本地磁盘&#xff1a; 1.Controller 创建一个FileUploadController类 package org.huangyingyuan.controller;import org.huangyingyu…...

Linux系统安装PaddleDetection

一、安装cuda 1. 查看设备 先输入nvidia-smi&#xff0c;查看设备支持的最大cuda版本&#xff0c;选择官网中支持的cuda版本 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/conda/linux-conda.html 2. 下载CUDA并安装 使用快捷键…...

JVM 内存结构全解析

带你深入 JVM 内存结构,搞懂运行时数据区到底是怎么回事 JVM 的内存结构到底长什么样?程序计数器、虚拟机栈、堆、方法区、直接内存到底有什么用?这篇文章将从实际运行角度出发, 用一篇文章彻底讲透 JVM 的运行时数据区。一、为什么你必须搞懂 JVM 内存结构? 在一次线上…...

K8S node ARP 表爆满 如何优化

当 Kubernetes 节点的 ARP 表爆满时&#xff0c;可能会导致网络通信故障。以下是针对该问题的优化策略和解决方案&#xff1a; 一、ARP 表爆满的危害 网络不通&#xff1a;新的 ARP 请求无法被处理&#xff0c;导致数据包无法转发。性能下降&#xff1a;ARP 表查找效率降低&a…...

SpringMVC——第7章:HttpMessageConverter

一、HttpMessageConverter HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 1.什么是HTTP消息 HTTP消息其实就是HTTP协议。HTTP协议包括请求协议和响应协议。…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.4 异构数据源整合(CSV/JSON/Excel数据导入)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL异构数据源整合&#xff1a;CSV/JSON/Excel数据导入全攻略4.4 异构数据源整合&#xff1a;多格式数据导入实战4.4.1 CSV数据导入&#xff1a;高效批量处理4.4.1.1…...

在macOS上安装windows系统

使用Boot Camp 1. 准备工作&#xff1a;确认Mac满足Boot Camp系统要求&#xff0c;准备好Windows安装光盘或ISO映像文件&#xff0c;以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理&#xff1a;在“应用程序”文件夹的“实用工具”中找到“Boot…...

最长回文子串(动规 + 中心拓展)

目录 [BM73 最长回文子串](https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId295&tags&title&difficulty0&judgeStatus0&rp0&sourceUrl/exam/oj?questionJobId10&subTabNameonline_coding_page)1. 动态规划(1)状态表示:…...

学习海康VisionMaster之亮度测量

一&#xff1a;进一步学习了 今天学习下VisionMaster中的亮度测量&#xff1a;这个和前面学习的都不一样了&#xff0c;这个是测量ROI区域内的平均亮度等 1&#xff1a;什么是亮度测量&#xff1f; 我们工业上用的相机里面有一个感光芯片&#xff08;CCD/CMOS&#xff09;&…...

LeetCode 238:除自身以外数组的乘积(Java实现)

文章目录 **题目描述**解决思路1. 两次遍历法&#xff08;左右乘积法&#xff09;2. 核心思想 Java代码实现复杂度分析示例说明步骤分解 注意事项总结 题目描述 给定一个整数数组 nums&#xff0c;返回一个数组 answer&#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外…...

LintCode第23题-判断数字与字母字符 第145题-大小写转换 第283题-三数之中的最大值

思路: 直接使用包装类的方法来判断 比如: isLetter(char c)判断是否是字母&#xff08;包括大小写、非英语字母也行&#xff09; isDigit(char c)判断是否是数字&#xff08;0~9&#xff09; isLetterOrDigit(char c)是否是字母或数字&#xff08;等价于 isLetter isLower…...

Visual Studio 项目转Qt项目

1. 先确保qmake 和 minGW &#xff08;g&#xff09; 路径都在系统变量内&#xff1b;或者通过WinR -> cmd 来检测&#xff0c; 如果能够 显示qmake 的信息 &#xff0c; g 的信息 &#xff0c; 就说明设置环境变量成功。 2. 打开项目文件夹&#xff0c;在这里打开cmd, 换…...

判断字符是否唯一 --- 位运算

目录 一&#xff1a;题目 二&#xff1a;算法与原理 三&#xff1a;代码分析 一&#xff1a;题目 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法与原理 三&#xff1a;代码分析 class Solution { publ…...

react路由使用方法

react路由常用方法 一、router安装与基础路由二、路由跳转三、路由参数四、路由嵌套无论是小程序端、web端还是移动端前端开发都需要使用到路由组件,学会了路由之后便可以灵活开发各种交互页面。可以说路由在前端开发中占有非常重要的位置。在React中,路由使用方式和Vue比较相…...

Wannier90文件与参数

Wannier90源码https://github.com/wannier-developers/wannier90/releases/tag/v3.1.0 用法 Wannier90 可以以两种模式运行&#xff1a; 后处理模式 Post-processing mode&#xff1a;从文件中读取第一性原理代码计算得到的重叠和投影。我们预计这是使用 wannier90 最常见的…...

学习黑客Nmap 原理

练气期第一重 — 神识探查术&#xff08;Nmap 原理&#xff09; 场景设定 诸位道友&#xff08;学生&#xff09;刚踏入信息安全修真界&#xff0c;手中只有一柄“网路灵剑”&#xff08;本地终端&#xff09;。想要探知远处服务器的灵脉&#xff08;端口&#xff09;、功法&am…...

VBA信息获取与处理专题五:VBA利用CDO发送电子邮件

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

Git 第一讲---基础篇 git基础概念与操作

前言&#xff1a; Git&#xff0c;作为目前全球最流行的分布式版本控制系统&#xff0c;以其高效、灵活和强大的分支管理能力&#xff0c;成为开发者手中不可或缺的工具。从个人开源项目到企业级应用&#xff0c;Git的身影无处不在。然而&#xff0c;对初学者而言&#xff0c;…...

心衰生物标志物NT-ProBNP和BNP

B型利钠肽&#xff08;BNP&#xff09;和N末端B型利钠肽原&#xff08;NT-proBNP&#xff09;都属于利尿钠肽&#xff08;NP&#xff09;家族。当发生心衰时&#xff0c;NT-ProBNP和BNP的浓度会升高&#xff0c;它们是心衰&#xff08;HF&#xff09;和心功能障碍诊疗中应用最广…...

Winform(11.案例讲解1)

今天写两个案例,用于更好的理解控件的使用 在写之前先写一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.案例讲解 { internal class Student { public string …...

卡尔曼滤波详解

1. 卡尔曼滤波能解决什么问题&#xff1f; 卡尔曼滤波用于解决含噪声的动态系统状态估计问题&#xff0c;例如&#xff1a; 通过GPS和IMU数据估计车辆位置 通过电压电流测量估计电池电量(SOC) 雷达追踪飞行器轨迹 它的核心优势是&#xff1a; 递归计算&#xff1a;只需前一…...

数据类型:String

String目录 SetGetMsetMgetIncrIncrbySubstrGetrangeSetrange String是字符串类型&#xff0c; redis给我们提供了String类型的value&#xff0c; 但是内部的实现一共有三种&#xff1a; int、embstr、raw&#xff1b; 三种的不同之处在于当value长度较小的时候使用embstr和int…...

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…...

Hive安装与配置教程

Hive安装与配置教程 1. 环境准备 1.1 系统要求 Java 8或更高版本Hadoop 2.x或更高版本MySQL或其他关系型数据库&#xff08;用于存储元数据&#xff09; 1.2 安装依赖 # 安装Java sudo apt update sudo apt install openjdk-8-jdk# 安装MySQL sudo apt install mysql-serv…...

C++负载均衡远程调用学习之获取主机信息功能

目录 01Lars-lbAgentV0.2-赋值均衡数据结构关系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb数据结构的定义 03Lars-lbAgentV0.2-proto协议的定义 04 Lars-lbAgentV0.2-route_lb与UDP server的关联 05 -Lars-lbAgentV0.2-route_lb与UDP server的关联 06Lars…...

C++ 适配器模式详解

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间能够协同工作。 概念解析 适配器模式的核心思想是&#xff1a; 接口转换&#xff1a;将一个类的接口转换成客户希望的另一个接口 兼容性&#xff1a;使原本由于接…...

2025.5.5总结

今日感悟&#xff1a;这假期就这样结束了&#xff0c;玩了一次滑板&#xff0c;打扫了一次租房&#xff0c;出去逛了一次街&#xff0c;看完了一本书&#xff0c;追了一部剧。既没有家人&#xff0c;也没有能一同畅饮的同学&#xff0c;更没有对象&#xff0c;显得确实有些孤独…...

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…...

kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程

一 从 LiveData 迁移到 Kotlin Flow 完整教程 LiveData 长期以来是 Android 架构组件中状态管理的核心&#xff0c;但随着 Kotlin Flow 的成熟&#xff0c;Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节&#xff0c;完成平滑迁移。 一、为什…...

PostgreSQL 的 pg_ls_waldir 函数

PostgreSQL 的 pg_ls_waldir 函数 pg_ls_waldir 是 PostgreSQL 中用于列出预写式日志(WAL)目录内容的重要函数&#xff0c;特别适用于 WAL 文件管理和数据库恢复场景。 一、函数基本说明 语法 pg_ls_waldir() RETURNS SETOF text功能 返回 WAL 目录中所有文件的名称集合在…...

形式化数学——Lean求值表达式

作为学习 Lean 的程序员&#xff0c;最重要的是理解求值的工作原理。求值是求得表达式的值的过程&#xff0c;就 像算术那样。例如&#xff0c;15 - 6 的值为 9&#xff0c;2 (3 1) 的值为 8。要得到后一个表达式的值&#xff0c;首先将 3 1 替换为 4&#xff0c;得到 2 4&…...