第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏
讲动人的故事,写懂人的代码
2.6.6 用as进行类型转换:显式而简洁的语法
贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_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的as | Java类型转换 | C++类型转换 |
|---|---|---|---|
| 用途 | 转换整数、浮点数、指针类型 | 转换基本数据类型、对象引用类型 | 转换基本数据类型、指针、引用、对象 |
| 语法 | <表达式> as <目标类型> | (<目标类型>)<表达式> | (<目标类型>)<表达式>(C风格),<类型转换操作符><目标类型>(<表达式>)(C++风格) |
| 代码示例 | let x: i32 = 42;let y: u8 = x as u8; // 将 i32 类型的 x 转换为 u8 类型的 y | int a = 10;double b = (double) a; // 将 int 类型的 a 转换为 double 类型的 b | int 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语言的编译流程包括: 预编译:将.c 中的头文件展开、宏展开,生成的文件是.i 文件。gcc指令:gcc -E file.c -o file.i 编译:将预处理之后的.i 文件生成 .s 汇编文件。gcc指令: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,这次拿到了一个 不得不说MAC度过适应期后用起来很舒服,续航长,触控板舒服,轻薄无比 我前期过度的时候记录的一部分快速指南,掌握如下一些电脑常识 可以做到正常使用了 基本操作 在 Mac 上使用桌…...
Go TOKEN机制与跨域处理方式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
JavaScript 的运行
语法分析预编译解释执行 1.语法分析 语法分析是 JavaScript 引擎处理代码的第一步。 在这个阶段,引擎将源代码字符串分解成一个个的词素(token),这些词素是语言中有意义的最小单元,如关键字、变量名、操作符等。 语…...
园区地图导航系统:技术原理、部署方案与智能化应用解析
随着智能化时代的到来,园区管理面临诸多挑战。维小帮园区地图导航系统,采用前沿技术,为园区提供全面的导航解决方案,极大提升了园区管理效率和用户体验。 一、园区地图导航系统的功能特点 维小帮园区地图导航系统,以其…...
【数据结构】第十六弹---C语言实现希尔排序
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…...
用Python向Word文档添加页眉和页脚
用Python向Word文档添加页眉和页脚 添加页眉和页脚效果代码 添加页眉和页脚 在本文中,我们将用python向文档中添加页眉和页脚。 效果 添加前的文档: 添加页眉和页脚后: 代码 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 优点 隐藏资源的访问行为,无法通过地址的值对资源适合中操作书写简化 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国密算法:优秀的密码散列函数
随着信息技术的飞速发展,信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术,其重要性不言而喻。中国在密码学领域也取得了显著的成就,其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…...
【安卓】在安卓中使用HTTP协议的最佳实践
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
Spring Boot集成antlr实现词法和语法分析
1.什么是antlr? Antlr4 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询࿱…...
多线程中run()和start()的区别
我们知道,在多线程中 Thread thread new Thread(runnable); thread.start();以及 thread.run();都可以执行runnable中run方法下的代码,但是二者又有所不同 下面给出一段代码用以体现二者的区别: 以下代码中,通过thread.start()启…...
Nginx基础理论
Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者或者公司基于Nginx开发出了众多的…...
【QT5】<应用> 小游戏:贪吃蛇
文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现:游戏界面存在一条蛇🐍,使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物,蛇可以吃食物,然后…...
【Webpack】使用 Webpack 构建 Vue3+TS 项目
构建项目目录 tsc --init npm init -yshim.d.ts 文件是一个类型声明文件,用于告诉 TypeScript 编译器如何处理 Vue 的单文件组件(SFC)和其他自定义模块。为 Vue 的单文件组件和其他非 TypeScript 模块提供类型信息,以便在 TypeScr…...
数据防泄漏的六个步骤|数据防泄漏软件有哪些
在当前复杂多变的网络安全环境下,数据防泄漏软件成为了企业信息安全架构中不可或缺的一环。下面以安企神软件为例,告诉你怎么防止数据泄露,以及好用的防泄露软件。 1. 安企神软件 安企神软件是当前市场上备受推崇的企业级数据防泄漏解决方案…...
SpringCloud 网关Gateway配置并使用
目录 1 什么是网关? 2 Gateway的使用 2.1 在其pom文件中引入依赖 2.2 然后gateway配置文件中配置信息 2.3 启动网关微服务 3 网关处理流程 4 前端-网关-微服务-微服务间实现信息共享传递 1 什么是网关? 网关:就是网络的关口ÿ…...
别再死记硬背ATT报文了!用Wireshark抓包实战,带你搞懂BLE通信里Handle和UUID的映射过程
实战拆解BLE通信:用Wireshark透视Handle与UUID的动态映射 当你第一次看到BLE设备通信时,那些十六进制数字在屏幕上闪烁,就像在看天书。Handle、UUID、ATT报文——这些概念在文档里写得清清楚楚,但真正抓包分析时,却总感…...
保姆级教程:Langchain框架详解 - 大模型开发者的必备技能
什么是Langchain Langchain是一款提供给用户与大模型之间快捷沟通的代理框架,其核心设计思想就是整合各大模型厂商的接口,给用户提供一个快捷入口能快速实现自己的agent。 核心组件 •agent:Langchain的核心部分,所有的操作都围…...
如何用轻量工具实现Windows 11系统深度净化?
如何用轻量工具实现Windows 11系统深度净化? 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改善你的Wi…...
从Provisional headers are shown到证书过期:uniapp请求无响应的幕后真相
从Provisional headers are shown到证书过期:uniapp请求无响应的深度排查指南 当你正在调试一个运行良好的uniapp项目时,突然发现所有网络请求在真机上毫无征兆地停止工作——没有错误提示,没有响应数据,只有开发者工具中冷冰冰的…...
SDMatte模型推理性能剖析:使用Profiling工具定位计算瓶颈
SDMatte模型推理性能剖析:使用Profiling工具定位计算瓶颈 1. 为什么需要性能剖析 做AI模型推理优化就像修车一样,你得先知道哪里出了问题才能对症下药。SDMatte作为一款专业的图像抠图模型,在实际部署中经常会遇到推理速度慢、资源占用高等…...
基于图像的深度学习与MVS三维重建全流程服务 支持远程部署定制 含pcl/c++/matlab...
基于图像的深度学习MVS三维重建全流程 可远程部署,可定制 点云pcl,c,matlab开发,基于图像三维重建,点云算法开发 只需要提供摄的图像,即可生成完整的三维模型(大小场景均可)上周去爬了个浙西的小众山&#…...
UniHacker终极指南:免费解锁Unity全平台专业功能的完整方案
UniHacker终极指南:免费解锁Unity全平台专业功能的完整方案 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 作为一名Unity开发者,你是…...
YOLO12在工业质检场景:PCB缺陷识别与小目标检测实战案例
YOLO12在工业质检场景:PCB缺陷识别与小目标检测实战案例 1. 引言:当AI质检员遇上电路板 想象一下,你是一家电子厂的质检主管。每天,成千上万块印刷电路板(PCB)从生产线上下来,每一块都需要经过…...
B站视频下载终极指南:DownKyi高效工具完整使用教程
B站视频下载终极指南:DownKyi高效工具完整使用教程 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等ÿ…...
3类被90%开发者忽略的农田图像噪声——基于ISO 17202-2标准的Python去噪实战手册
第一章:农田图像噪声的认知革命与ISO 17202-2标准全景解读传统农业视觉系统长期将图像噪声视为需“压制”的干扰项,而ISO 17202-2:2023《农业遥感图像质量评估—第2部分:噪声建模与语义敏感性分级》首次确立噪声作为农田场景的**可解释性特征…...
