【Rust 学习笔记】Rust 基础数据类型介绍——指针、元组和布尔类型

news2025/2/25 5:39:07

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

博客内容主要围绕:
       5G/6G协议讲解
       高级C语言讲解
       Rust语言讲解



文章目录

  • Rust 基础数据类型介绍——指针、元组和布尔类型
    • 一、元组类型
    • 二、指针类型简介
      • 2.1 引用
      • 2.2 Box
      • 2.3 裸指针
    • 三、布尔类型
    • 四、类型别名

Rust 基础数据类型介绍——指针、元组和布尔类型

一、元组类型

       元组是各种类型的值的一个序列,序列中的每个元素用逗号分隔开并包裹在一个圆括号中。例如 (“Brazil”, 1995) 是一个元组,其第一个元素是一个静态分配的字符串,第二个元素是一个整数,它的类型是 (&str, i32) 。给定一个元组值 t ,可以通过 t.0 、t.1 等访问其元素。

       元组有点儿像数组,即这两种类型都表示值的有序序列。与数组不同的是:

  • 元组的每个元素可以是不同的类型,而数组的元素必须都是相同的类型;
  • 元组只允许用常量作为索引,例如 t.4。不能通过写成 t.i 或者 t[i] 的形式来获取第 i 个元素;

       Rust 通常会使用元组类型从一个函数返回多个值,例如字符串切片上的 split_at 方法会将字符串分成两半并返回它们,其声明如下所示:

fn split_at(&self, mid: usize) -> (&str, &str);

返回类型为 (&str, &str) 是两个字符串切片构成的元组,可以使用模式匹配语法将返回值的每个元素赋值给不同的变量:

let text = "I see the eigenvalue in thine eye";
let (head, tail) = text.split_at(21);
assert_eq!(head, "I see the eigenvalue ");
assert_eq!(tail, "in thine eye");

       另一种常用的元组类型是零元组()。通常也称为单元类型,因为此类型只有一个值,写作 () 。当无法携带任何有意义的值但其上下文仍然要求传入某种类型时,Rust就会使用单元类型。例如,不返回值的函数的返回类型为()。标准库的 std::mem::swap 函数就没有任何有意义的返回值,它只会交换两个参数的值,其声明如下所示:

fn swap<T>(x: &mut T, y: &mut T);

其中的 <T> 意味着 swap是泛型的:可以将对任意类型T的值的引用传递给它,但是上述的声明省略了swap的返回类型,其完整的声明如下所示:

fn swap<T>(x: &mut T, y: &mut T) -> ();

类似地,如果返回类型是 Result< (), std::io::Error >,这意味着该函数在出现错误时会返回一个 std::io::Error 值,但成功时不会返回任何值。

       Rust允许在任何出现逗号的位置,例如,函数参数、数组、元组、结构体和枚举定义等,添加额外的尾随逗号。对于单个值的元组,例如,(“lonely hearts”,) ,其只包含一个值且这个值后面的逗号是必需的,用于区分单值元组和简单的括号表达式

二、指针类型简介

2.1 引用

       在Rust中可以将引用视为基本指针类型。在运行期时,对 i32 的引用是一个保存着 i32 地址的机器字,这个地址可能位于栈或堆中。表达式 &x 会生成一个对 x 的引用,在 Rust 术语中,我们会说它借用了对 x 的引用。给定一个引用 r,表达式 *r 会引用 r 指向的值。它们非常像 C 和 C++ 中的 & 运算符和 * 运算符,并且和 C 中的指针一样,当超出作用域时引用不会自动释放任何资源。

       然而,与C指针不同,Rust的引用永远不会为空,在安全的Rust中根本没办法生成空引用。与C不同,Rust会跟踪值的所有权和生命周期,因此早在编译期间就排除了悬空指针、双重释放和指针失效等错误。

       Rust 引用有两种形式:

  • &T:不可变的共享引用。可以同时拥有多个对给定值的共享引用,但它们是只读的,禁止修改它们所指向的值,就像C中的 const T* 一样;
  • &mut T:可变且独占的引用。可以读取和修改它指向的值,就像C语言中的 T* 一样。但是只要该引用还存在,就不能对该值有任何类型的其他引用。事实上,访问该值的唯一途径就是使用这个可变引用。

Rust使用共享引用和可变引用之间的二选一机制,来强制执行单个写入者或多个读取者规则。

2.2 Box

       在堆中分配内存最简单的方式是使用 Box::new,如下代码所示:

let t = (12, "eggs");
let b = Box::new(t); //在堆中分配一个元组

上面代码中,t 的类型是 (i32, &str),所以 b 的类型是 Box<(i32, &str)>。对 Box::new 的调用会分配足够的内存以在堆上容纳此元组。当 b 超出作用域时,内存会立即释放,除非 b 已被移动(move)。

2.3 裸指针

       Rust 也有裸指针类型 *mut T*const T。裸指针实际上和 C++ 中的指针很像。使用裸指针是不安全的,因为 Rust 不会跟踪它指向的内容。例如,裸指针可能为空,或者它们可能指向已释放的内存或现在包含不同类型的值。只能在 unsafe 块中对裸指针解引用。

三、布尔类型

       Rust 中的布尔类型bool具有此类型常用的两个值truefalse==<等比较运算符会生成 bool 结果,比如 2 < 5 的值为 true。

       许多语言对要求布尔值的上下文中使用其他类型的值持宽松态度,比如C和C++会把字符、整数、浮点数和指针隐式转换为布尔值,因此它们可以直接用作 if 语句或 while 语句中的条件。Python 允许在布尔上下文中使用字符串、列表、字典甚至集合,如果这些值是非空的,则将它们视为 true。然而,Rust 非常严格,**像 if 和 while 这样的控制结构要求它们的条件必须是 bool 表达式,短路逻辑运算符 && 和 || 也是如此。你必须写成 if x != 0 {…} ,而不能只写成 if x {…}。

       Rust 中的 as 运算符可以将 bool 值转换为整数:

assert_eq!(false as i32, 0);
assert_eq!(true  as i32, 1);

但是,as 无法进行另一个方向的转换,例如,从数值类型转换为bool。相反,你必须显示的写出比较表达式,比如 x != 0。

       尽管 bool 只需要用一个位来表示,但 Rust 在内存中会使用整字节来表示 bool 值,因此可以创建指向它的指针

四、类型别名

       与 C++ 中的 typedef 用法类似,可以使用 type 关键字来为现有类型声明一个新名称:

type Bytes = Vec<u8>;

上面声明的类型 Bytes 就是这种特定 Vec 的简写形式。

fn decode(data: &Bytes) {
    ...
}


在这里插入图片描述

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

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

相关文章

YOLO系列的学习

YOLOV1全解 You Only Look Once&#xff0c;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;&#xff01;&#xff01;效率高&#xff0c;可对视频进行实时检测&#xff0c;应用领域非常广&#xff0c;到V3的时被美国军方用于军事行动&#xff0c;作者出于某…

鸿蒙应用开发搬砖经验之—使用DevTools工具调试前端页面

环境说明&#xff1a; 系统环境&#xff1a;Mac mini M2 14.5 (23F79) 开发IDE&#xff1a;DevEco Studio 5.0.1 Release 配置步骤&#xff1a; 按着官方的指引来慢慢一步一步来&#xff0c;但前提是要配置好SDK的路径&#xff08;没有配置的话&#xff0c;可能先看下面的配…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

Django REST framework 源码剖析-视图类详解(Views)

Django REST framework视图图解 视图类&#xff08;View&#xff09; ‌视图‌是DRF中处理用户请求的基本单元。它们可以是函数视图&#xff08;FBV&#xff09;或类视图&#xff08;CBV&#xff09;。函数视图使用函数来处理请求&#xff0c;而类视图则使用类来处理请求。类视…

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303&#xff1f;1.2 为什么使用 JSR 303&#xff1f; 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…

网页单机版五子棋小游戏项目练习-初学前端可用于练习~

今天给大家分享一个 前端练习的项目&#xff0c;技术使用的是 html css 和javascrpit 。希望能对于 刚刚学习前端的小伙伴一些帮助。 先看一下 实现的效果图 1. HTML&#xff08;HyperText Markup Language&#xff09; HTML 是构建网页的基础语言&#xff0c;它的主要作用是定…

UE5材质节点Distance

Distance可以计算两个物体间的距离&#xff0c;可以用来做过渡效果 当相机和物体距离3000的时候&#xff0c;就会渐渐从蓝过渡到红色&#xff0c;除以500是为了平滑过渡

【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析

引言 在人工智能助手的应用领域中&#xff0c;美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词&#xff0c;探讨其结构设计、功能实现以及实际应用效果。 提出你的菜系&#xff0c;为你分析&#xff0c;并生成图片卡片 提示词…

基于开发/发布/缺陷分离模型的 Git 分支管理实践20250103

基于开发/发布/缺陷分离模型的 Git 分支管理实践 引言 在现代软件开发中&#xff0c;合理的分支管理策略是保证项目成功的关键因素之一。本文将详细介绍一种基于开发/发布/缺陷分离的 Git 分支管理模型&#xff0c;这种模型不仅能提升团队协作效率&#xff0c;还能确保代码质…

【Cocos TypeScript 零基础 3.1】

目录 场景跳转 场景跳转 把新建好的TS文件与场景绑定 选中 场景 或 camera 拖进右边的 属性检查器 双击T文件,进入编辑 至于用什么IDE看个位朋友高兴 我这里有 VScode ,先用这个,老师也没有推荐 (老师也用的是这个) VScode UI 也有中文包,请自行上网搜索 打开创建的TS文件后…

SAP SD学习笔记23 - 无偿出荷(免费交货)与继续无偿出荷(继续免费交货)

上一章讲了SAP中的一括请求处理。 SAP SD学习笔记22 - VF04&#xff0c;VF06&#xff0c;VF24 等一括请求处理-CSDN博客 本章继续讲SAP中的内容&#xff1a;无偿出荷 和 继续无偿出荷。 - 无偿出荷本身是挺常用的&#xff0c;常见的例子就是送给客户样品&#xff1b; - 继续…

021-spring-springmvc-组件

SpringMVC的handMapping 比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是&#xff1a; org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc…

实现一个iOS晃动动画

有时候在开发中&#xff0c; 需要我们实现一个晃动动画&#xff0c; 达到一个提示的效果&#xff0c;如下图所示 思路&#xff0c; 我们要实现的本质上是一个旋转动画&#xff0c;然后 设置一个旋转角度&#xff0c;以底部中间为中心旋转&#xff0c; 左右各有一个旋转的角度…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

利用3DGS中convert.py处理自采数据

前言 3DGS源码中convert.py提供对自采数据集的处理&#xff0c;需要预先安装Colmap和ImageMagick. ubuntu22.04安装colmap 点击进入NVIDIA官网&#xff0c;查看GPU的CMAKE_CUDA_ARCHITECTURES 1、克隆colmap源码&#xff0c;并进入colmap文件夹 git clone https://github.c…

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…

实践:事件循环

实践&#xff1a;事件循环 代码示例 console.log(1); setTimeout(() > console.log(2), 0); Promise.resolve(3).then(res > console.log(res)); console.log(4);上述的代码的输出结果是什么 1和4肯定优先输出&#xff0c;因为他们会立即方式堆栈的执行上下文中执行&am…

从零开始开发纯血鸿蒙应用之逻辑封装

从零开始开发纯血鸿蒙应用 一、前言二、逻辑封装的原则三、实现 FileUtil1、统一的存放位置2、文件的增删改查2.1、文件创建与文件保存2.2、文件读取2.2.1、读取内部文件2.2.2、读取外部文件 3、文件删除 四、总结 一、前言 应用的动态&#xff0c;借助 UI 响应完成&#xff0…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…