Rust-类型

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.hqwc.cn/news/343222.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI生成APP工具推荐:5款让你惊艳的AI应用

在这个数字化、智能化的时代&#xff0c;人工智能(AI)已经深入到我们生活的方方面面。其中&#xff0c;AI生成APP工具更是以其强大的创意和生成能力&#xff0c;成为自媒体人和设计师们的得力助手。本文将为你介绍五款实用的AI生成APP工具&#xff0c;它们将为你的创意打开无限…

Linux反向、分离解析与主从复制

前言 上篇介绍了DNS正向解析&#xff0c;本文将继续介绍反向解析与主从复制等内容。域名反向解析即从IP地址到域名的映射。为了完成逆向域名解析&#xff0c;系统提供一个特别域&#xff0c;该特别域称为逆向解析域。 目录 前言 一、反向解析 1. 配置bind服务 2. 修改区…

活动图作业

活动图作业 一. 简答题&#xff08;共7题&#xff0c;100分&#xff09; (简答题) 活动图和顺序图之间有什么区别&#xff1f;它们的特点是什么。 正确答案&#xff1a; 顺序图做为一种交互图&#xff0c;强调的是对象到对象的控制流&#xff08;交互&#xff09;&#xff0c;…

实时能见度测量系统是什么

TH-NJD50实时能见度测量系统是一种先进的测量设备&#xff0c;用于测量大气中的能见度&#xff0c;即空气中的透明度。它通过使用光学技术和传感器技术&#xff0c;可以实时监测和测量大气中的颗粒物、气体和其他物质的浓度&#xff0c;从而计算出空气中的能见度。 实时能见度测…

stl中的list模拟实现

目录 一、list的简单介绍二、写出节点的代码三、模拟实现迭代器&#xff08;重点&#xff09;1、list中的迭代器是怎么实现的2、编写iterator类的代码3、对const_iterator进行理解4、编写const_iterator类的代码5、对iterator类和const_iterator类进行合并 四、list类进行代码实…

国产六核CPU商显板,三屏异显,米尔基于全志D9360开发板

芯驰D9-Pro 自主可控、安全可信的高性能商显方案 采用国产CPU&#xff1a;集成了6个ARM Cortex-A551.6GHz 高性能CPU和1个ARM Cortex-R5800MHz&#xff1b; 高性能的高安全HSM安全的处理器&#xff0c;支持TRNG、AES、RSA、SHA、SM2/3/4/9&#xff1b; 它包含100GFLOPS 3D G…

软件测试|Beautiful Soup库详细使用指南

简介 Beautiful Soup是一款强大的Python库&#xff0c;广泛用于解析HTML和XML文档&#xff0c;从中提取数据并进行处理。它的灵活性和易用性使得数据抽取变得简单&#xff0c;本文将详细介绍Beautiful Soup库的基本用法和示例。 安装Beautiful Soup 首先&#xff0c;需要确保…

Flink CDC 实时抽取 Oracle 数据-排错调优

前言 Flink CDC 于 2021 年 11 月 15 日发布了最新版本 2.1&#xff0c;该版本通过引入内置 Debezium 组件&#xff0c;增加了对 Oracle 的支持。对该版本进行试用并成功实现了对 Oracle 的实时数据捕获以及性能调优&#xff0c;现将试用过程中的一些关键细节进行分享。 使用…

超简单的简历模板精选5篇

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…

44-js return返回值,全局作用域,局部作用域,隐式作用域,变量的生命周期,delete释放内存

1.return返回值:函数执行后剩下结果就是返回值。 function fn(a,b,c){//return返回值return(a+b+c);// console.log("aaa"); //return之后的值都不在执行了// alert("bbb"); //return之后的值不在执行了}console.log(fn(1,2,3)*10); 2.作用…

【c++】类和对象1

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成 …

计算机体系结构动态调度(计分板及Tomasulo)学习记录

1.动态调度核心思想&#xff1a;允许就绪指令越过前方停顿指令&#xff0c;提前进入运行&#xff08;乱序执行&#xff09; 就绪指令指不存在资源冲突、操作数已就绪的指令&#xff0c;例如&#xff0c;计分板算法使用计分板来实现&#xff0c;Tomasulo使用保留站来实现&#…