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

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码

2.6.6 用as进行类型转换:显式而简洁的语法

贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prevsum_of_two_dice都是u32类型,u32类型并不支持abs()方法。所以,我们需要使用as关键字把它们都转换成支持abs()方法的i32类型。”

let previous_diff = (prev as i32 - sum_of_two_dice as i32).abs();

“在 Rust 中,我们使用 as 关键字进行类型转换,语法简洁明了,能清楚地表明类型转换的意图。这种方式让代码的可读性更高,更容易理解和维护哦~”
在这里插入图片描述

“不过,要注意一下,在 Rust 中,使用 as 关键字进行类型转换时,并不会自动检查转换过程中是否会有溢出、数据丢失或精度丧失的情况。这种转换是直接将一个类型的值转换为另一个类型的值,所以可能会导致截断或数据丢失。在使用 as 时,我们需要格外小心哦。”

艾极思用表格将三种语言的类型转换进行了对比。

类型转换Rust的asJava类型转换C++类型转换
用途转换整数、浮点数、指针类型转换基本数据类型、对象引用类型转换基本数据类型、指针、引用、对象
语法<表达式> as <目标类型>(<目标类型>)<表达式>(<目标类型>)<表达式>(C风格),<类型转换操作符><目标类型>(<表达式>)(C++风格)
代码示例let x: i32 = 42;let y: u8 = x as u8; // 将 i32 类型的 x 转换为 u8 类型的 yint a = 10;double b = (double) a; // 将 int 类型的 a 转换为 double 类型的 bint x = 5;double y = (double) x; // C风格转换,将 int 类型的 x 转换为 double 类型的 y int x = 5; double y = static_cast(x); // C++风格转换,使用 static_cast 进行类型转换
检查无类型检查有类型检查(运行时和编译时)有类型检查(dynamic_cast),无类型检查(static_cast等)
转换风险可能导致数据丢失或截断对象类型转换可能抛ClassCastException,基本类型可能导致数据丢失C风格转换不安全,static_cast等有较高风险,dynamic_cast较安全
适用场景基本类型、指针转换基本类型转换,类型安全的对象转换基本类型转换,指针和引用的转换,特殊场景使用不同转换
扩展性只能用于标量类型支持对象引用类型的多态转换支持更多类型的转换和控制
安全性转换不检查类型,容易出错类型安全,检查严格多种类型转换方式可选,灵活但复杂

2.6.7 在loop里的String::new()是否会增大内存占用?

赵可菲:“在那个一直转啊转的loop里,那句let mut guess = String::new();,会不会让上一轮新弄出来的字符串实例默默等待被垃圾回收,这样内存占用岂不是要增加?”

贾克强友善地说:“Java程序员有这种担心,是很自然的哦。在Java中,内存管理主要依赖于垃圾回收器,这意味着程序员不需要手动管理内存,垃圾回收器会自动回收不再使用的对象的内存。”

“但在Rust里,没有Java那样的垃圾回收机制(garbage collection),所以不会出现你说的情况的。在Rust中,内存管理主要通过所有权(ownership)系统来实现。当变量超出其作用域(scope)时,它所占用的内存会立即被释放。”

“比如,在咱们的Rust代码中,虽然每次循环都会创建一个新的字符串实例guess,但是每次循环结束后,这个字符串实例就会超出其作用域,随即实例会被销毁,内存也就被释放。这样就不会导致内存占用不断增加的问题。”

“Rust的这种内存管理方式比垃圾回收更为高效,因为它避免了垃圾回收器在运行时对内存的额外开销。通过所有权系统和作用域管理,Rust能够确保内存的高效使用。”

席双嘉:“事实上,Rust的基于所有权的内存管理机制,能够有效地实现超出作用域的变量的内存自动释放。相比之下,C++的内存安全主要靠程序员手动管理,而Rust无疑提供了更高的便利性。然而,在一个loop里,循环导致的字符串实例的多次创建和销毁,可能会产生一定的系统开销。那么,如果我们把这句let mut guess = String::new();放到loop之外,我相信这将对性能产生积极的影响。”

贾克强向席双嘉竖起大拇指,笑眯眯地赞扬道:“果然是追求极致性能的C++高手!说得太好了。的确,将字符串实例的创建放到循环之外,能有效减少这种开销。但是,也得记得在每次循环开始时确保字符串实例是空的,否则程序会出错哦。因此,在每次使用之前,都要清空字符串。记得用String::clear()方法哦,这样可以轻松清空字符串实例。”

@@ -10,11 +10,12 @@ fn main() {println!("The sum of two dice is: {sum_of_two_dice}");let mut previous_guess: Option<u32> = None;
+    let mut guess = String::new();loop {println!("Please input your guess (between 2 and 12).");-        let mut guess = String::new();
+        guess.

相关文章:

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…...

大话C语言:第24篇 预处理

1 C语言编译流程 C语言的编译流程包括&#xff1a; 预编译&#xff1a;将.c 中的头文件展开、宏展开&#xff0c;生成的文件是.i 文件。gcc指令&#xff1a;gcc -E file.c -o file.i 编译&#xff1a;将预处理之后的.i 文件生成 .s 汇编文件。gcc指令&#xff1a;gcc -S file…...

React如何配置路由

ReactTs配置路由 安装依赖 npm i react-router-dom在routers下面创建index.tsx import { RouteObject } from react-router-dom import React from react import PageA from /views/PageA import PageB from /views/PageB const routes: RouteObject[] [{path: /,element: …...

MAC使用初体验+入门

之前从来没有使用过MAC&#xff0c;这次拿到了一个 不得不说MAC度过适应期后用起来很舒服&#xff0c;续航长&#xff0c;触控板舒服&#xff0c;轻薄无比 我前期过度的时候记录的一部分快速指南&#xff0c;掌握如下一些电脑常识 可以做到正常使用了 基本操作 在 Mac 上使用桌…...

Go TOKEN机制与跨域处理方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

JavaScript 的运行

语法分析预编译解释执行 1.语法分析 语法分析是 JavaScript 引擎处理代码的第一步。 在这个阶段&#xff0c;引擎将源代码字符串分解成一个个的词素&#xff08;token&#xff09;&#xff0c;这些词素是语言中有意义的最小单元&#xff0c;如关键字、变量名、操作符等。 语…...

园区地图导航系统:技术原理、部署方案与智能化应用解析

随着智能化时代的到来&#xff0c;园区管理面临诸多挑战。维小帮园区地图导航系统&#xff0c;采用前沿技术&#xff0c;为园区提供全面的导航解决方案&#xff0c;极大提升了园区管理效率和用户体验。 一、园区地图导航系统的功能特点 维小帮园区地图导航系统&#xff0c;以其…...

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…...

用Python向Word文档添加页眉和页脚

用Python向Word文档添加页眉和页脚 添加页眉和页脚效果代码 添加页眉和页脚 在本文中&#xff0c;我们将用python向文档中添加页眉和页脚。 效果 添加前的文档&#xff1a; 添加页眉和页脚后&#xff1a; 代码 from docx import Documentdef add_header_footer(doc_path…...

REST风格

黑马程序员Spring Boot2 文章目录 1、REST简介1.1 优点1.2 REST风格简介1.3 注意事项 2、RESTful入门案例 1、REST简介 1.1 优点 隐藏资源的访问行为&#xff0c;无法通过地址的值对资源适合中操作书写简化 1.2 REST风格简介 按照RST风格访问资源时使用行为动作区分对资源进…...

Mongodb连接测试程序【Java版】

先导入Maven依赖 <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.9.0</version> </dependency>import com.mongodb.MongoClientSettings; import com.mongodb.MongoCred…...

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展&#xff0c;信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术&#xff0c;其重要性不言而喻。中国在密码学领域也取得了显著的成就&#xff0c;其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…...

【安卓】在安卓中使用HTTP协议的最佳实践

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

Spring Boot集成antlr实现词法和语法分析

1.什么是antlr&#xff1f; Antlr4 是一款强大的语法生成器工具&#xff0c;可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析&#xff0c;每天处理超过20亿次查询&#xff1…...

多线程中run()和start()的区别

我们知道&#xff0c;在多线程中 Thread thread new Thread(runnable); thread.start();以及 thread.run();都可以执行runnable中run方法下的代码&#xff0c;但是二者又有所不同 下面给出一段代码用以体现二者的区别&#xff1a; 以下代码中&#xff0c;通过thread.start()启…...

Nginx基础理论

Nginx最为最受欢迎的反向代理和负载均衡服务器&#xff0c;被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻量&#xff0c;更多的是得益于Nginx的高性能特性&#xff0c;以及支持插件化开发&#xff0c;为此&#xff0c;很多开发者或者公司基于Nginx开发出了众多的…...

【QT5】<应用> 小游戏:贪吃蛇

文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现&#xff1a;游戏界面存在一条蛇&#x1f40d;&#xff0c;使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物&#xff0c;蛇可以吃食物&#xff0c;然后…...

【Webpack】使用 Webpack 构建 Vue3+TS 项目

构建项目目录 tsc --init npm init -yshim.d.ts 文件是一个类型声明文件&#xff0c;用于告诉 TypeScript 编译器如何处理 Vue 的单文件组件&#xff08;SFC&#xff09;和其他自定义模块。为 Vue 的单文件组件和其他非 TypeScript 模块提供类型信息&#xff0c;以便在 TypeScr…...

数据防泄漏的六个步骤|数据防泄漏软件有哪些

在当前复杂多变的网络安全环境下&#xff0c;数据防泄漏软件成为了企业信息安全架构中不可或缺的一环。下面以安企神软件为例&#xff0c;告诉你怎么防止数据泄露&#xff0c;以及好用的防泄露软件。 1. 安企神软件 安企神软件是当前市场上备受推崇的企业级数据防泄漏解决方案…...

SpringCloud 网关Gateway配置并使用

目录 1 什么是网关&#xff1f; 2 Gateway的使用 2.1 在其pom文件中引入依赖 2.2 然后gateway配置文件中配置信息 2.3 启动网关微服务 3 网关处理流程 4 前端-网关-微服务-微服务间实现信息共享传递 1 什么是网关&#xff1f; 网关&#xff1a;就是网络的关口&#xff…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...