Rust 数据类型使用注意点

文章目录

  • 前言
  • 一、Rust 的数据类型
      • 基本数据类型:
      • 复合数据类型:
  • 二、使用注意点📢
      • 整型溢出
  • 总结


前言

Rust 学习系列 ,学习rust的数据类型。牢记其中的注意点📢


一、Rust 的数据类型

Rust 提供了丰富的数据类型,包括基本数据类型和复合数据类型。

基本数据类型:

  1. 布尔类型(bool):表示 true 或 false。
  2. . 字符类型(char):表示单个 Unicode 字符。
  3. 数值类型:
    • 整数类型(i8、i16、i32、i64、i128、isize):有符号整数。
    • 无符号整数类型(u8、u16、u32、u64、u128、usize):无符号整数。
    • 浮点数类型(f32、f64):单精度和双精度浮点数。

复合数据类型:

  1. 数组(array):固定大小的相同类型元素的集合。
  2. 元组(tuple):固定大小的不同类型元素的集合。
  3. 切片(slice):动态大小的数组引用。
  4. 字符串(string):动态大小的 UTF-8 字符串。
  5. 结构体(struct):自定义数据类型,可以包含多个字段。
  6. 枚举(enum):定义一个类型的取值集合。
  7. 特定用途的数据类型:例如 Option、Result<T, E> 等。

在这里插入图片描述

在这里插入图片描述

除了这些基本和复合数据类型,Rust 还提供了一些高级数据类型和特性,如引用、生命周期、泛型、trait 等,用于更灵活地处理数据。这些数据类型和特性使得 Rust 具有强大的类型系统和内存安全性。

来一些代码示例练习一波⚽️

fn main() {// 声明和初始化变量let number: i32 = 42;let is_true: bool = true;let letter: char = 'a';let array: [i32; 3] = [1, 2, 3];let tuple: (i32, bool) = (10, false);// 使用变量println!("The number is: {}", number);println!("Is it true? {}", is_true);println!("The letter is: {}", letter);println!("The array is: {:?}", array);println!("The tuple is: {:?}", tuple);// 使用引用let reference: &i32 = &number;println!("The reference is: {}", reference);let mut number2: i32 = 42;let mutable_reference: &mut i32 = &mut number2;*mutable_reference += 1;println!("The mutable reference is: {}", mutable_reference);
}

二、使用注意点📢

  1. 变量绑定:在声明变量时,需要指定变量的数据类型。Rust的类型推导功能可以自动推断变量的数据类型,但在某些情况下需要明确指定类型。

  2. 不可变和可变性:Rust中默认情况下,变量是不可变的。如果需要修改变量的值,需要使用mut关键字声明可变变量。

  3. 所有权系统:Rust的所有权系统是其最重要的特性之一。它规定了变量在内存中的所有权和使用规则。在Rust中,每个值都有一个所有者,并且只能有一个所有者。所有权可以通过移动(move)或借用(borrow)的方式转移。移动所有权规定了变量在传递给函数时的所有权转移,而借用所有权规定了变量在引用(borrow)时的限制。这个所有权系统可以避免内存安全问题和数据竞争。

  4. 引用:Rust中的引用(Reference)是指对变量的借用,它允许通过引用访问变量的值,但不允许修改变量的值。引用在函数传参和数据共享等场景下非常有用。

  5. 字面量和类型转换:Rust中的字面量可以直接表示特定类型的值,例如整数、浮点数和布尔值等。如果需要将一个类型转换为另一个类型,可以使用as关键字进行类型转换。

  6. 枚举和结构体:Rust提供了枚举(Enum)和结构体(Struct)两种复合数据类型。枚举用于表示一组相关的值,而结构体用于表示一组相关的字段。

整型溢出

比方说有一个 u8 ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出(integer overflow),这会导致两种行为的其中一种。当在调试(debug)模式编译时,Rust 会检查整型溢出,若存在这些问题则使程序在编译时 panic。Rust 使用 panic 这个术语来表明程序因错误而退出。第 9 章 “panic! 与不可恢复的错误”会详细介绍 panic。

在当使用 --release 参数进行发布(release)模式构建时,Rust 不检测会导致 panic 的整型溢出。相反当检测到整型溢出时,Rust 会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作。简而言之,大于该类型最大值的数值会被“包裹”成该类型能够支持的对应数字的最小值。比如在 u8 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖整型溢出包裹的行为不是一种正确的做法。

要显式处理溢出的可能性,可以使用标准库针对原始数字类型提供的以下一系列方法:

使用 wrapping_* 方法在所有模式下进行包裹,例如 wrapping_add
如果使用 checked_* 方法时发生溢出,则返回 None 值
使用 overflowing_* 方法返回该值和一个指示是否存在溢出的布尔值
使用 saturating_* 方法使值达到最小值或最大值


总结

Rust 数据类型的介绍,其中介绍数据使用需要特别注意的点

更多内容请参考
https://rustwiki.org/zh-CN/book/ch03-02-data-types.html

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

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

相关文章

新火种AI|寒武纪跌落神坛!七年连亏50亿,AI芯片第一股不行了吗?

作者&#xff1a;文子 编辑&#xff1a;小迪 连年亏损&#xff0c;烧钱不止&#xff0c;寒武纪终是走到悬崖边缘。 寒武纪市值腰斩&#xff0c;连续七年累亏50亿 继连续六年亏损之后&#xff0c;寒武纪又迎来第七年亏损。 1月30日晚&#xff0c;寒武纪正式对外发布2023年年…

ref用法

目录 React中提供两种方法创建ref对象&#xff1a; 类组件获取 Ref 三种方式 ① Ref属性是一个字符串。 ② Ref 属性是一个函数。 ③ Ref属性是一个ref对象。 高级用法1&#xff1a;forwardRef 转发 Ref 高级用法2&#xff1a;ref实现组件通信 【ref作用】&#xff1a;最…

GPTs保姆级教程之实践

GPTs什么 使用GPTs的前提&#xff1a;ChatGPT Plus帐号 GTPs的作用&#xff1a;把我们和GPT对话的prompt&#xff0c;封装起来成为一个“黑匣子”。 主要有两个作用&#xff1a; 1、避免反复输入prompt&#xff0c;“黑匣子”打开&#xff0c;输入问题即可使用 2、在别人可以…

Verilog刷题笔记21

题目&#xff1a; A priority encoder is a combinational circuit that, when given an input bit vector, outputs the position of the first 1 bit in the vector. For example, a 8-bit priority encoder given the input 8’b10010000 would output 3’d4, because bit[4…

python 函数式编程入门:Lambda 函数的魅力

python 函数式编程入门&#xff1a;Lambda 函数的魅力 介绍Lambda 函数的应用排序过滤映射map、filter、reduce数据转换和筛选 介绍 Lambda 函数是 Python 中一个强大的功能&#xff0c;它可以快速创建匿名函数。在函数式编程中&#xff0c;lambda 函数发挥着至关重要的作用。…

算法效率的度量-时间空间复杂度

常对幂指阶 1.时间复杂度 事前预估 算法 时间开销 T(n) 与 问题规模 n 的关系&#xff08; T 表示 “ time ”&#xff09; 一般默认问题规模为n。 1.单循环 2.嵌套两层循环都为n 3.单层循环指数递增型 4.搜索型 链接 &#xff1a;第七章查找算法&#xff01;&#xff01…

Visual Studio 20XX控制台程序鼠标点击阻塞问题

文章目录 方法一方法二 在Visual Studio 20xx编写的控制台程序中&#xff0c;当鼠标点击控制台时&#xff0c;会阻塞控制台程序运行&#xff0c;不按回车无法继续运行。 方法一 右击控制台标题栏&#xff0c;选择属性&#xff0c;去掉快速编辑模式(Q)的勾选&#xff0c;如&…

Django连接Mysql

修改setting.py配置文件 连接前&#xff0c;需要创建数据库 安装mysql客户端 因为连接需要一个客户端&#xff0c;而python没有客户端&#xff0c;所以就需要一个客户端来接收你填写的参数 pip install mysqlclient

【MySQL】学习如何使用DCL进行用户管理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-JwFD16F1Kh0fle0X {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Simulink|光伏阵列模拟多类故障(开路/短路/阴影遮挡/老化)

目录 主要内容 模型研究 1.正常模型 2.断路故障 3.短路故障 4.阴影遮挡 5.老化模型 结果一览 1.U-I曲线 2.P-V曲线 下载链接 主要内容 该模型为光伏阵列模拟故障情况simulink模型&#xff0c;程序实现了多种故障方式下的光伏阵列输出功率-电压-电流关系特…

【Vue3】解决路由缓存问题(响应路由参数的变化)

官方文档解释&#xff1a; 解决问题的思路: 让组件实例不复用,强制销毁重建监听路由变化,变化之后执行数据更新操作 方案一&#xff1a;给router-view添加key 以当前路由完整路径为key 的值&#xff0c;给router-view组件绑定 <RouterView :key"$route.fullPath&qu…

【MATLAB源码-第137期】基于matlab的NOMA系统和OFDMA系统对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOMA&#xff08;非正交多址&#xff09;和OFDMA&#xff08;正交频分多址&#xff09;是两种流行的无线通信技术&#xff0c;广泛应用于现代移动通信系统中&#xff0c;如4G、5G和未来的6G网络。它们的设计目标是提高频谱效…