Rust-类型

news2024/11/16 18:40:01

bool

布尔类型(bool)代表的是“是”和“否”的二值逻辑。它有两个值:true和false。

一般用在逻辑表达式中,可以执行“与”“或”“非”等运算。

在这里插入图片描述

char

字符类型由char表示。它可以描述任何一个符合unicode标准的字符值。在代码中,单个的字符字面量用单引号包围。

在这里插入图片描述
字符类型字面量也可以使用转义符:
在这里插入图片描述
因为char类型的设计目的是描述任意一个unicode字符,因此它占据的内存空间不是1个字节,而是4个字节。

对于ASCⅡ字符其实只需占用一个字节的空间,因此Rust提供了单字节字符字面量来表示ASCⅡ字符。我们可以使用一个字母b在字符或者字符串前面,代表这个字面量存储在u8类型数组中,这样占用空间比char型数组要小一些。示例如下:

在这里插入图片描述

整数类型

Rust有许多的数字类型,主要分为整数类型和浮点数类型。本节讲解整数类型。各种整数类型之间的主要区分特征是:有符号/无符号,占据空间大小。

在这里插入图片描述
需要特别关注的是isize和usize类型。

它们占据的空间是不定的,与指针占据的空间一致,与所在的平台相关。如果是32位系统上,则是32位大小;如果是64位系统上,则是64位大小。

在C++中与它们相对应的类似类型是int_ptr和uint_ptr。Rust的这一策略与C语言不同,C语言标准中对许多类型的大小并没有做强制规定,比如int、long、double等类型,在不同平台上都可能是不同的大小,这给许多程序员带来了不必要的麻烦。相反,在语言标准中规定好各个类型的大小,让编译器针对不同平台做适配,生成不同的代码,是更合理的选择。

数字类型的字面量表示可以有许多方式:

在这里插入图片描述字面量后面可以跟后缀,可代表该数字的具体类型,从而省略掉显示类型标记:
在这里插入图片描述

我们可以为任何一个类型添加方法,整型也不例外。比如在标准库中,整数类型有一个方法是pow,它可以计算n次幂,于是我们可以这么使用:

在这里插入图片描述
我们甚至可以不使用变量,直接对整型字面量调用函数:
在这里插入图片描述
对于整数类型,如果Rust编译器通过上下文无法分析出该变量的具体类型,则自动默认为i32类型。比如:
在这里插入图片描述

整数溢出

在整数的算术运算中,有一个比较头疼的事情是“溢出”。

在C语言中,对于无符号类型,算术运算永远不会overflow,如果超过表示范围,则自动舍弃高位数据。

对于有符号类型,如果发生了overflow,标准规定这是undefined behavior,也就是说随便怎么处理都可以。

未定义行为有利于编译器做一些更激进的性能优化,但是这样的规定有可能导致在程序员不知情的某些极端场景下,产生诡异的bug。

Rust的设计思路更倾向于预防bug,而不是无条件地压榨效率,Rust设计者希望能尽量减少“未定义行为”。

比如彻底杜绝“Segment Fault”这种内存错误是Rust的一个重要设计目标。

当然还有其他许多种类的bug,即便是无法完全解决,我们也希望能尽量避免。

整数溢出就是这样的一种bug。

Rust在这个问题上选择的处理方式为:默认情况下,在debug模式下编译器会自动插入整数溢出检查,一旦发生溢出,则会引发panic。

在release模式下,不检查整数溢出,而是采用自动舍弃高位的方式。示例如下:

Rust编译器还提供了一个独立的编译开关供我们使用,通过这个开关,可以设置溢出时的处理策略:

$rustc -C overflow-checks=no test.rs

“-C overflow-checks=”可以写“yes”或者“no”,打开或者关闭溢出检查。

如果在某些场景下,用户确实需要更精细地自主控制整数溢出的行为,可以调用标准库中的checked_*、saturating_*和wrapping_*系列函数。

在这里插入图片描述
输出结果为:
在这里插入图片描述
checked_*系列函数返回的类型是Option<_>,当出现溢出的时候,返回值是None。

saturating_*系列函数返回类型是整数,如果溢出,则给出该类型可表示范围的“最大/最小”值。

wrapping_*系列函数则是直接抛弃已经溢出的最高位,将剩下的部分返回。

在对安全性要求非常高的情况下,强烈建议用户尽量使用这几个方法替代默认的算术运算符来做数学运算,这样表意更清晰。

在Rust标准库中就大量使用了这几个方法,而不是简单地使用算术运算符,值得大家参考。
在很多情况下,整数溢出应该被处理为截断,即丢弃最高位。

浮点类型

Rust提供了基于IEEE 754-2008标准的浮点类型。按占据空间大小区分,分别为f32和f64,其使用方法与整型差别不大。浮点数字面量表示方式有如下几种:
在这里插入图片描述
Infinite和Nan是带来更多麻烦的特殊状态。Infinite代表的是“无穷大”,Nan代表的是“不是数字”(not a number)。

指针类型

  • 同一个类型,某些时候可以指定它在栈上,某些时候可以指定它在堆上。内存分配方式可以取决于使用方式,与类型本身无关。
  • 既可以直接访问数据,也可以通过指针间接访问数据。可以针对任何一个对象取得指向它的指针。
  • 既可以在复合数据类型中直接嵌入别的类型的实体,也可以使用指针,间接指向别的类型。
  • 甚至可能在复合数据类型末尾嵌入不定长数据构造出不定长的复合数据类型。Rust里面也有指针类型,而且不止一种指针类型。
    在这里插入图片描述
    在标准库中还有一种封装起来的可以当作指针使用的类型,叫“智能指针”(smart pointer)。

在这里插入图片描述

类型转换

Rust对不同类型之间的转换控制得非常严格。即便是下面这样的程序,也会出现编译错误:
在这里插入图片描述
Rust提供了一个关键字as,专门用于这样的类型转换:
在这里插入图片描述

tuple

tuple指的是“元组”类型,它通过圆括号包含一组表达式构成。tuple内的元素没有名字。tuple是把几个类型组合到一起的最简单的方式。比如:在这里插入图片描述
元组内部也可以一个元素都没有。这个类型单独有一个名字,叫unit(单元类型):let empty:()=();

可以说,unit类型是Rust中最简单的类型之一,也是占用空间最小的类型之一。
在这里插入图片描述

struct

结构体(struct)与元组类似,也可以把多个类型组合到一起,作为新的类型。区别在于,它的每个元素都有自己的名字。举个例子:

在这里插入图片描述

tuple struct

Rust有一种数据类型叫作tuple struct,它就像是tuple和struct的混合。区别在于,tuplestruct有名字,而它们的成员没有名字:
在这里插入图片描述

enum

如果说tuple、struct、tuple struct在Rust中代表的是多个类型的“与”关系,那么 enum类型在Rust中代表的就是多个类型的“或”关系。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具栏】RestfulTool 插件的使用(接口开发规范)

目录 1. 安装 2.使用 1. 安装 2.使用 点开控制层&#xff0c;该控制层写了什么接口一目了然 跳转对应的接口&#xff0c;查看代码

使用CloudCompare对obj网格模型转换为pcd/ply点云模型

1.打开CloudCompare&#xff0c;点击文件夹图标&#xff0c;首先先把文件类型选择为.obj&#xff0c;然后再去找预处理的obj网格模型&#xff0c;点击打开。 2.测试打开的obj网格模型如下图&#xff1a; 3.选中obj文件&#xff0c;点击网格上样本点的图标&#xff0c;输入预生成…

计算机毕业设计---SSH协会志愿者服务管理系统

项目介绍 该项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,志愿者管理,活动管理,捐赠管理,关于我们管理,友情链接管理,新闻类…

添加 自定义校验方法,让用户自定义校验规则

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 添加 常用校…

【分布式微服务专题】SpringSecurity OAuth2快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、OAuth2 介绍1.1 使用场景*1.2 基本概念&#xff08;角色&#xff09;1.3 优缺点 二、OAuth2的设计思路2.1 客户端授权模式2.1.0 基本参数说明2.1.1 授权码模式2.1.2 简化&#xff08;隐式&#xff09;模式2.1.3 密码模式2.1.4 客…

Jmerer之FTP测试

1、文件上传下载测试&#xff0c;可以使用sample:FTP请求&#xff0c;当然也可以使用HTTP Request采样器中的File Upload向服务器上传文件 2、本章重点介绍FTP请求进行文件的上传下载测试&#xff0c;添加 FTP请求&#xff0c;界面主要配置如下&#xff1a; Server Name or I…

程序员如何写高水平简历?(附模板)

Q&#xff1a;什么是高水平的简历&#xff1f; A&#xff1a;满足HR需求的同时&#xff0c;最大化的体现自身价值的简历是高水平的简历 HR的需求是什么&#xff1f; ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊&#xff01;花里胡哨真看不下去一点&…

软件测试当中的测试用例模板

测试用例这块知识、经验&#xff0c;小酋在前面陆续都讲完了。这章提供几种用例模板&#xff0c;作为这块知识的收尾。 - 1 - 测试用例&#xff08;主指功能测试用例模板&#xff09;的内容通常包括测试目标&#xff08;目的&#xff09;&#xff0c;需求标示&#xff08;一般…

Open CV 图像处理基础:(四)使用 Open CV 在 Java 中进行基本的图片模糊处理

使用 Open CV 在 Java 中进行基本的图片模糊处理 目录 使用 Open CV 在 Java 中进行基本的图片模糊处理方法介绍均值模糊&#xff08;Averaging Blur&#xff09;:高斯模糊&#xff08;Gaussian Blur&#xff09;:中值模糊&#xff08;Median Blur&#xff09;:双边滤波&#x…

软件测试工程师如何对算法做测试?

最近几年&#xff0c;随着大数据、人工智能等领域的快速发展&#xff0c;算法受到前所未有的重视&#xff0c;算法测试也随之兴起。 为了让大家能对算法测试有个初步的了解&#xff0c;这篇文章将对“如何做算法测试”进行梳理&#xff0c;大纲如下&#xff1a; 1、算法测试测…

C++20:从0到1学懂concept

目录 1.concept语法 1.1 替换typename1.2 requires关键字1.4 concept与auto2.编译器支持3.总结 C20引入了concept(概念)&#xff0c;是对模板参数(编译时评估)的一组约束。你可以将它们用于类模板和函数模板来控制函数重载和特化。一些优点包括&#xff1a; 对模版参数强制类型…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题&#xff1a;Mac 使用命令下载nvm 成功后执行 nvm -v 查看&#xff0c;报错&#xff1a;nvm command not found 2、原因&#xff1a;可能是系统更新后&#xff0c;默认的 shell 是 zsh&#xff0c;所以找不到配置文件 3、解决&#xff1a;可添加编辑.bash_profile 和 …

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

如何在 SwiftUI 中实现音频图表

文章目录 前言DataPoint 结构体BarChartView 结构体ContentView 结构体实现协议实现线图总结 前言 在可访问性方面&#xff0c;图表是复杂的事物之一。iOS 15 引入了一项名为“音频图表”的新功能。 下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任…

代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串 题目链接&#xff1a;回文子串 版本一&#xff1a;动态规划 dp数组及下标的含义 dp[i][j]&#xff1a;区间范围[i, j] &#xff08;左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否则为false。确定递推公式…

C语言用函数指针实现计算器

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现目录函数&#xff1b; void menum() {//打印目录&#xff1b;printf("***********************************************\n");printf("***…

什么是数通技术?以太网交换机在数通技术中的精要

什么是数通技术&#xff1f; 数通技术是指数字通信技术&#xff0c;它涵盖了数字信号处理、数据传输、网络通信等领域。通信工程师在数通技术中负责设计、建设和维护数字通信系统&#xff0c;以实现可靠、高效的信息传输。这涉及到数字信号的编解码、调制解调、数据压缩、网络…

【架构专题】我为什么要写Spring Cloud Alibaba微服务架构实战派上下册这本书?

在写这本书之前&#xff0c;我先后在两家杭州的“独角兽”公司担任技术负责人&#xff0c;并推进公司核心业务的“中台化”改造。在落地业务中台和技术中台的过程中&#xff0c;督促并指导开发人员统一使用Spring Cloud Alibaba作为中台服务最底层的基础框架。为了快速推进业务…

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载)

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载) 什么是自然语言处理 (NLP) ? 自然语言处理 (NLP) 是计算机科学的一个分支,更具体地说,是人工智能 (AI) 的分支,旨在让计算机能够以与人类大致相同的方式理解文本和语音。 自然语…

JavaEE学习笔记 2024-1-12 --Tomcat服务器、Servlet

JavaEE JavaEE是企业级开发 是综合性非常强的阶段  包含的知识点:JavaSE,MySQL,JDBC,WEB(HTML,CSS,JS,前端框架),Servlet,JSP,XML,AJAX等技术 1.服务器 JavaEE项目需要运行在服务器之上 WEB服务器就是WEB项目的容器,WEB项目的运行环境,将项目部署到服务器下,可以通过服务器…