【Rust】数据类型

news2025/5/26 3:00:28

目录

 思维导图

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; // f64
        let 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 annotation
        let 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 通过立即退出而不是允许内存访问并继续运行来保护你免受此类错误的影响。

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

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

相关文章

Matlab一些使用技巧

代码分段 两个百分号就可以实现代码的分段,不同段之间会以不同的背景色显示,方便调试 如下: %% 腐蚀 stlen TimeWidth*Fs/50; %线性算子的长度,1/100的脉宽,对应0.5us,15个采样点 stlen 100; SE strel…

【Linux系统】权限位(mode bits)

这张图是使用结构体 struct stat 中的 st_mode 字段时画的,获取表示文件的类型和权限,它是典型的 POSIX 系统调用(如 stat() 和 fstat())返回的 struct stat 结构的一部分,用于描述文件的元数据。 在 Linux 和 Unix 系…

快速上手 INFINI Console 的 TopN 指标功能

背景 在分布式搜索引擎系统(如 Easysearch、Elasticsearch 和 OpenSearch)中,性能监控至关重要。为了确保系统的高效运行和资源的合理分配,我们通常需要关注一段时间内关键资源的使用情况,特别是索引、节点和分片的内…

LIEF:用于解析和修改 ELF, PE 和MachO 格式的跨平台库

主要功能 1. 解析:LIEF能够解析ELF、PE和MachO格式,并给用户提供了友好的API来访问文件格式内部数据。 2. 修改:LIEF能够修改上述格式的部分数据。 3. 抽象:这些格式拥有一些常见特征,例如数据段、符号和入口…

验证码的设置

一、准备环境 首先,进入下载地址:Central Repository: cn/hutool/hutool-all/5.8.16下载jar包 二、配置环境 将下载好的jar包放到eclipse的lib目录 (这里是eclipse软件中存放jar包的目录): 【WebContent-->WEB-INF-->lib】 三、基础…

FreeCAD集成gmsh源码分析

目录 gmsh模块界面获取gmsh的版本执行gmsh网格划分gmsh模块界面 这个界面是用PySide来写的,Pyside是QT的python绑定,具体代码在task_mesh_gmsh.py文件中。目前这个界面非常的捡漏,没有对接gmsh稍微高级一点的功能。界面对应的事件处理是在gmshtools.py中。这里只分析“gmsh …

忘记了PDF文件的密码,怎么办?

PDF文件可以加密,大家都不陌生,并且大家应该也都知道PDF文件有两种密码,一个打开密码、一个限制编辑密码,因为PDF文件设置了密码,那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密? PDF和offi…

怎么开通电信跨国网络专线服务?

随着全球化的发展,企业对高效稳定的跨国网络连接需求不断增长。电信跨国网络专线服务凭借其灵活性、安全性和高效性,成为许多企业跨国通信的优选方案。本文将为您详细介绍如何开通这一服务,并分享关键的注意事项,帮助企业更好地利…

MarkDown常用方法

标题 #空格 一级标题 ##空格 二级标题 依次类推 有序列表 操作:数字英文小数点(.)空格示例:1. list12. list2无序列表 操作:- 空格 或 * 空格示例: - list1- list2嵌套有序列表 操作:tab 数字 空格 示例: …

使用gtsam添加OrientedPlane3Factor平面约束因子

在基于地面约束的SLAM优化中,已知的地面信息(如 plan.pcd 文件中的地面模型)可以用作一个先验约束,以帮助优化位姿估计。具体而言,这个过程涉及将地面模型和每个帧的位姿结合,以创建一个因子模型&#xff0…

二分查找算法——搜索插入位置

一.题目描述 35. 搜索插入位置 - 力扣(LeetCode) 二.题目解析 如果只看题目的前半句,直接就用简单二分秒了。但是题目还有后半句,如果找不到目标值,则返回它应该插入的位置。 因为数组是排序的,所以应该…

啥!GitHub Copilot也免费使用了

文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近,GitHub 给开发者们带来了一个好消息:他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了!以前,每个月要花 10 美元才能享受的服务,现在对所…

【计算机网络】窥探计网全貌:说说计算机网络体系结构?

标签难度考察频率综合题⭐⭐⭐60% 这个问题在计算机网络知识体系中是一个比较重要的问题,只有完整地了解计算机网络的体系结构才能清晰地认识网络的运行原理。 在回答这个问题时,笔者认为有几个比较重要的点: 首先一定要分清楚前置条件&am…

Web开发中页面出现乱码的解决(Java Web学习笔记:需在编译时用 -encoding utf-8)

目录 1 引言2 乱码表现、原因分析及解决2.1 乱码表现2.2 原因分析2.3 解决 3 总结 1 引言 Web开发的页面出现了乱码,一直不愿写出来,因为网上的解决方案太多了。但本文的所说的页面乱码问题,则是与网上的大多数解决方案不一样,使…

Cesium小知识:pointPrimitive collection 详解

Cesium.PointPrimitiveCollection 是 Cesium 中用于高效管理和渲染大量点(points)的一个类。它允许你创建和管理大量的 PointPrimitive 实例,这些实例可以用来表示地理空间中的点数据,如传感器位置、车辆位置、兴趣点等。与直接使用 Cesium.Entity 相比,PointPrimitiveCol…

说一说mongodb组合索引的匹配规则

一、背景 有一张1000多万条记录的大表,需要做归档至历史表,出现了大量慢查询。 查询条件是 "classroomId": {$in: ["xxx", "xxx", ..... "xxx","xxx", "xxx" ] }耗时近5秒,且…

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

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

谁在打响整车智能「芯」战役

汽车智能化,显然已经不仅是舱和驾。 尤其是对于算力和智能化来说,即便是已经相对成熟的新能源动力系统,还远未普及。本周,在2025年CES展上,英特尔联合汽车芯片初创公司—Silicon Mobility正式推出面向电动汽车动力总成…

C++ 【从零手撕,模拟实现list类】

1、基础框架 从list源代码中我们可以看到list底层为带哨兵位双向循环链表,从设计者的角度来看,我们并不知道用户在链表中存储的数据类型,所以在这里要使用类模板。再者,每一个节点都包含了前向、后向指针和存储的数据值&#xff0…

gesp(C++五级)(1)洛谷:B3941:[GESP样题 五级] 小杨的锻炼

gesp(C五级)(1)洛谷:B3941:[GESP样题 五级] 小杨的锻炼 题目描述 小杨的班级里共有 n n n 名同学,每位同学都有各自的锻炼习惯。具体来说,第 i i i 位同学每隔 a i a_i ai​ 天就会进行一次锻炼&#x…