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

【Rust】数据类型

目录

 思维导图

1. 数据类型概述

1.1 标量类型

1.1.1 整数类型

1.1.2 浮点数类型

1.1.3 布尔类型

1.1.4 字符类型

1.2 复合类型

1.2.1 元组类型

1.2.2 数组类型

2. 类型注解与类型推断

3. 整数溢出处理

4. 数字运算

5. 示例


思维导图

1. 数据类型概述

Rust是一种静态类型语言,所有变量的类型在编译时必须明确。Rust支持两种主要的数据类型:标量类型和复合类型。

1.1 标量类型

标量类型表示单一值,Rust的四种主要标量类型包括:

  • 整数(Integer)
  • 浮点数(Floating-point)
  • 布尔值(Boolean)
  • 字符(Character)
1.1.1 整数类型
  • 整数类型是没有小数部分的数字,Rust提供了多种整数类型,包括有符号和无符号的8位、16位、32位、64位和128位整数。
  • 例如,u32表示一个无符号32位整数,范围从0到4294967295。
  • 整数的类型可以通过在数字后添加后缀来指定,如57u8表示8位无符号整数。
  • isize 和 usize 类型取决于程序运行的计算机架构,表格中用“arch”表示:如果是在 64 位架构上,则为 64 位;如果是在 32 位架构上,则为 32 位。
整数类型
LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

Rust特殊的编写字面量:

整数字面量
Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_0000
Byte (u8 Only)b'A'
1.1.2 浮点数类型
  • Rust有两种浮点数类型:f32f64,分别表示32位和64位的浮点数。
  • 默认情况下,Rust使用f64,因为它在现代CPU上与f32的速度相近,但精度更高。
1.1.3 布尔类型
  • 布尔类型只有两个值:truefalse,在Rust中用bool表示。
1.1.4 字符类型
  • Rust的字符类型用char表示,支持Unicode标量值,可以表示多种语言的字符和符号。
  • 字符使用单引号表示,如'z''?'

1.2 复合类型

复合类型可以将多个值组合成一个类型,Rust的两种基本复合类型是元组(Tuple)和数组(Array)。

1.2.1 元组类型
  • 元组是将多个不同类型的值组合在一起的固定长度的集合。
  • 创建元组的语法为使用括号包裹的逗号分隔的值,例如let tup: (i32, f64, u8) = (500, 6.4, 1);
  • 元组的元素可以通过模式匹配进行解构。
1.2.2 数组类型
  • 数组是一种固定长度的集合,所有元素必须是同一类型。
  • 数组的定义方式为使用方括号包裹的逗号分隔的值,例如let a = [1, 2, 3, 4, 5];
  • 数组的类型可以通过指定元素类型和长度来定义,如let a: [i32; 5] = [1, 2, 3, 4, 5];
  • 数组的元素可以通过索引访问,例如let first = a[0];
  • 如果尝试访问超出数组范围的索引,Rust会在运行时崩溃并提示错误。

2. 类型注解与类型推断

Rust的编译器通常能够根据变量的值和使用方式推断出类型,但在某些情况下,例如从字符串转换为数字时,需要显式添加类型注解。示例代码如下:

let guess: u32 = "42".parse().expect("Not a number!");[14]

如果未提供类型注解,编译器会提示需要更多信息。

3. 整数溢出处理

  • Rust在调试模式下会检查整数溢出,导致程序在运行时崩溃。
  • 在发布模式下,Rust会进行二进制补码包装,超出范围的值会“回绕”到最小值。

4. 数字运算

Rust支持基本的数学运算,包括加、减、乘、除和取余。示例代码展示了如何在let语句中使用这些运算:

let sum = 5 + 10;
let difference = 95.5 - 4.3;
let product = 4 * 30;
let quotient = 56.7 / 32.2;
let remainder = 43 % 5;

5. 示例

  1. 类型注解示例

    fn main() {let guess: u32 = "42".parse().expect("Not a number!");
    }
    

    该示例展示了如何使用类型注解来指定变量guess的类型为u32

  2. 整数类型示例

    fn main() {let x: (i32, f64, u8) = (500, 6.4, 1);
    }
    

    这里定义了一个元组x,包含不同类型的整数和浮点数。

  3. 浮点数示例

    fn main() {let x = 2.0; // f64let y: f32 = 3.0; // f32
    }
    

    该示例展示了如何声明浮点数变量,默认类型为f64

  4. 布尔类型示例

    fn main() {let t = true;let f: bool = false; // with explicit type annotation
    }
    

    该示例展示了布尔类型的使用,布尔值可以是truefalse

  5. 字符类型示例

    fn main() {let c = 'z';let z: char = 'ℤ'; // with explicit type annotationlet heart_eyed_cat = '😻';
    }
    

    这里展示了如何声明字符类型的变量,Rust的字符类型支持Unicode。

  6. 数组示例

    fn main() {let a = [1, 2, 3, 4, 5];
    }
    

    该示例展示了如何定义一个包含多个整数的数组。

  7. 访问数组元素示例

    fn main() {let a = [1, 2, 3, 4, 5];let first = a[0];let second = a[1];
    }
    

    这里展示了如何通过索引访问数组中的元素。

  8. 无效数组元素访问示例

    use std::io;
    fn main() {let a = [1, 2, 3, 4, 5];println!("Please enter an array index.");let mut index = String::new();io::stdin().read_line(&mut index).expect("Failed to read line");let index: usize = index.trim().parse().expect("Index entered was not a number");let element = a[index];println!("The value of the element at index {index} is: {element}");
    }
    

    此代码编译成功。如果使用cargo run运行此代码并输入01234,程序将打印出数组中该索引处的对应值。如果输入超出数组末尾的数字,例如10,您将看到如下输出:

    thread 'main' panicked at src/main.rs:19:19:
    index out of bounds: the len is 5 but the index is 10
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

    程序在使用无效值进行索引操作时导致了运行时错误。程序以错误信息退出,并未执行最后的println!语句。

  9. 注意:当你尝试使用索引访问元素时,Rust 会检查你指定的索引是否小于数组长度。如果索引大于或等于长度,Rust 程序就会崩溃。因此,这种检查必须在运行时进行,尤其是在这种情况下,因为编译器无法预先知道用户稍后运行代码时会输入什么值。这是Rust的一个内存安全原则:当用户提供错误的索引时,可能会访问到无效的内存。Rust 通过立即退出而不是允许内存访问并继续运行来保护你免受此类错误的影响。

相关文章:

【Rust】数据类型

目录 思维导图 1. 数据类型概述 1.1 标量类型 1.1.1 整数类型 1.1.2 浮点数类型 1.1.3 布尔类型 1.1.4 字符类型 1.2 复合类型 1.2.1 元组类型 1.2.2 数组类型 2. 类型注解与类型推断 3. 整数溢出处理 4. 数字运算 5. 示例 思维导图 1. 数据类型概述 Rust是一种静…...

在现代工业自动化领域CClinkIE转ModbusTCP网关的应用

在现代工业自动化领域,开疆智能CCLINKIE转ModbusTCP网关扮演着至关重要的角色,尤其是在立体仓库的应用中。立体仓库系统通过高度集成的自动化设备和先进的信息技术,实现了物料存储和管理的高效率。CCLINKIE转ModbusTCP网关作为连接不同工业通…...

ASP.NET Core与GraphQL集成

一、引言:探索 C# 与ASP.NET Core、GraphQL 的协同魅力 在当今数字化浪潮中,Web 开发领域不断演进,新技术层出不穷。C# 作为.NET 平台上的中流砥柱,凭借其强大的功能与优雅的语法,成为众多开发者构建各类应用程序的得…...

Zabbix 从入门到精通

一、Zabbix 简介 1.1 什么是 Zabbix Zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。它能监控各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位 / 解决存在的各种问题。 1…...

文生图模型的技术原理、训练方案与微调方案

文生图模型的技术原理、训练方案与微调方案 引言 文生图(Text-to-Image)模型是一类能够根据文本描述生成对应图像的深度学习模型。近年来,随着生成对抗网络(GANs)和扩散模型(Diffusion Models)等技术的进步,文生图模型在图像生成领域取得了显著的进展。本文将详细介绍…...

3_CSS3 渐变 --[CSS3 进阶之路]

CSS3 引入了渐变(gradients),它允许在两个或多个指定的颜色之间显示平滑的过渡。CSS3 支持两种类型的渐变: 线性渐变(Linear Gradients):颜色沿着一条线性路径变化,可以是水平、垂直…...

国内主流的Spring微服务方案指南

构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置,包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容,详细介绍一个完整的中…...

docker更换镜像源脚本

Ubuntu / Debian 系统下的脚本 sudo curl -fsSL http://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/Ubuntu-Debian.sh | sh CentOS / RHEL 系统下的脚本 sudo curl -fsSL\n\nhttp://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/CentOS%20%20RHEL.sh | …...

Java Web开发进阶——错误处理与日志管理

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中,合理的错误处理机制不仅能够提升用户体验,还能帮助开发者快速定位问题;而有效的日志管理能够帮助团队监控应用运行状态,及时发现和解决问题。 1. 常见错误…...

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端,为分组交换网上的不同主句提供通信服务,网络层的传输单位是数据报。 主要的功能; 1,路由选择:路由选择指网络层根据特定算法,为数据包从源节点到目…...

【论文笔记】多个大规模数据集上的SOTA绝对位姿回归方法:Reloc3r

abstract 视觉定位旨在确定查询图像相对于姿势图像数据库的相机姿势。 近年来,直接回归相机姿势的深度神经网络由于其快速推理能力而受到欢迎。 然而,现有方法很难很好地推广到新场景或提供准确的相机姿态估计。 为了解决这些问题,我们提出了…...

springMVC---常用注解

目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1)DeptController类 (2)index.jsp (3)启动tomcat 四、P…...

青龙面板脚本开发指南:高效自动化任务的实现

青龙面板脚本开发指南:高效自动化任务的实现 青龙面板(Qinglong Panel)是一款强大的任务管理平台,支持多种语言的脚本开发和执行。通过在青龙面板中编写和管理脚本,用户可以轻松实现自动化任务,提高工作效…...

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…...

网络应用技术 实验七:实现无线局域网

一、实验简介 在 eNSP 中构建无线局域网,并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理; 2 、熟悉无线局域网的规划与构建过程; 3 、掌握无线局域网的配置方法; 三、实验学时 2 学时 四、实…...

kubeneters-循序渐进Cilium网络(一)

文章目录 概要传统网络不同的网络(或子网)之间通信Kubernetes 中的网络在同一栋大楼内的公寓之间通信跨大楼的通信总结 概要 本文通过“封包追踪”方法,深入解析 Kubernetes 网络通信过程。基于 eBPF 的 Cilium 工具,直观展示了数…...

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库…...

Qt之http客户端类

一、HTTP客户端类功能: 1、POST请求发送: 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送: 简单的GET请求实现支持下载进度监控 3、状态监控: 通过信号槽机制监控上传/下载进度错误处理和状态回调 /…...

18.C语言文件操作详解:指针、打开、读取与写入

目录 1.文件指针2.fopen3.标准流4.fclose5.EOF6.freopen()7.fgetc与getc8. fputc与putc9.fprintf10.fscanf11.fgets12.fputs13.fwrite14.fread15.feof16.fseek17.ftell18.rewind19.fgetpos()与fsetpos20.ferror与clearerr21.remove22.rename 1.文件指针 本篇原文为&#xff1a…...

深入浅出 OpenResty

1. 引言 1.1. OpenResty简介 OpenResty 是一个基于 Nginx 的高性能 Web 平台,它集成了大量模块,并原生支持 Lua 脚本。这使得开发者能够以非常灵活的方式实现复杂的逻辑,而无需重新编译或扩展 Nginx 核心。OpenResty 的主要特点包括&#x…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...