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

2.2 复合类型

复合类型表示一个变量可以保存多个值,这些值的类型如果不同,则是元祖类型,如果这些值的类型相同则是数组类型。

元祖类型可以表示某个物体的各种不同属性,可以使用不同的类型进行表达。例如:一个三口之间,每个人的姓名、身高和年龄。数组类型表示某个物体包含了固定长度的相同类型的不同数值或相同数值。例如:一个三口之家每个人的姓名或每个人的身高。

元祖和数组的区别:

特性

元组(Tuple)​

数组(Array)​

元素类型

可以不同(异构,如 (i32, f64, &str)

必须相同(同构,如 [i32; 3]

访问方式

通过索引(如 t.0)或模式匹配解构

通过索引(如 a[0])或切片操作

内存布局

元素可能不连续(类型不同导致内存对齐不同)

元素连续存储(类型相同)

迭代支持

需手动实现或转换为迭代器

原生支持迭代(如 for x in &array { ... }

常用场景

临时组合少量异构数据(如函数多返回值)

存储同构数据集合(如固定大小的缓冲区)

语法示例

let t = (1, 3.14, "hello");

let a = [1, 2, 3];

长度类型标注

不需要(通过元素推断)

需标注(如 [i32; 5]

方法支持

无内置方法(需自行解构或处理)

有内置方法(如 len(), map()

元祖和数组的相同点:

长度固定:两者在创建时,长度就固定了,无法扩展或缩小。

存储在栈上:默认情况下,两者的都是栈上保存的。

支持模式匹配:通过模式匹配进行结构或访问元素。

支持泛型和类型推导:编译器可以自行推导出他们的类型(部分情况下无法进行推导,系统会给出提示信息,这时就需要进行显示标识)。

      1. 元祖类型

将固定长度且不同类型的一组数据保存在一个变量内。

定义:let 变量名:(类型1,类型2, ...)=(变量1,变量2, ...);

fn main() {let person = ("曹操", 178.5, 40);println!("person:{:?}", person);}

访问方法1:使用解构

fn main() {let person = ("曹操", 178.5, 40);let (name,height,age) = person;println!("name:{},height:{},age:{}", name, height, age);}

访问方法2:使用下标

fn main() {let person = ("曹操", 178.5, 40);let name = person.0;let height = person.1;let age = person.2;println!("name:{},height:{},age:{}", name, height, age);}

      1. 数组类型

将固定长度且相同类型的一组数据保存在一个变量内。

定义: let 数组变量名:[类型;长度]=[变量1,变量2, ...];

let 数组变量名=[变量;长度];

fn main() {let names:[&str;3] = ["曹操", "刘备", "孙权"];let ages=[10;5];println!("names: {:?}", names);println!("ages: {:?}", ages);}

访问方法1:使用下标

fn main() {//使用下标访问数组中的元素let a = [1, 2, 3, 4, 5];let first = a[0];let second = a[1];println!("The first element is: {}", first);println!("The second element is: {}", second);}  

访问方法2:使用切片

fn main() {//使用切片访问数组的元素let a = [1, 2, 3, 4, 5];let slice1 = &a[1..3];let slice2 = &a[1..];let slice3 = &a[..3];let slice4 = &a[..];println!("slice1: {:?}", slice1);println!("slice2: {:?}", slice2);println!("slice3: {:?}", slice3);println!("slice4: {:?}", slice4);}

注意:当使用下标时,需要注意下标的索引值不可以超过数组的最大长度,否则系统会在编译时就报错,如果索引值不是直接获取的,而是经过计算或保存在其他变量中间接获取的,编译时虽然不会报错,但是运行时也会报错。

fn main() {//索引值超出数组范围let a = [1, 2, 3];let index = 10;let element = a[index];println!("The value of element is: {}", element);}

系统报错信息:

--> src\main.rs:5:19|5 |     let element = a[index];|                   ^^^^^^^^ index out of bounds: the length is 3 but the index is 10|= note: `#[deny(unconditional_panic)]` on by defaulterror: could not compile `lession02_02_06` (bin "lession02_02_06") due to 1 previous error

间接获取的索引值

fn main() {//数组下标的索引值间接获取,编译时检测通过,但是运行时会越界let a = [1, 2, 3, 4, 5];let b = [1, 2, 6, 7, 8];println!("{:?}",a[b[2]]);}

http://www.dtcms.com/a/537061.html

相关文章:

  • 做网站图片自动切换宁波软件开发
  • quat:高性能四元数运算库
  • [MySQL]表——分组查询
  • 济南做网站的好公司有哪些极简资讯网站开发
  • 网站后台页面设计互联网+可以做什么项目
  • 项目八 使用postman实现简易防火墙功能
  • 使用postman 测试restful接口
  • 2008 iis 添加 网站 权限设置网站策划案4500
  • 以自主创新推动能源装备智能化升级,为能源安全构筑“确定性”底座
  • 构建AI智能体:七十六、深入浅出LoRA:低成本高效微调大模型的原理与实践
  • 中国各大网站排名网站源码爬取
  • FFmpeg 安装与配置教程(Windows 系统)
  • 【数字逻辑】 60进制数字秒表设计实战:用74HC161搭计数器+共阴极数码管显示(附完整接线图)
  • 新网网站空间花都网站建设价格
  • 前端底层原理与复杂问题映射表
  • Digital Micrograph下载安装教程
  • 怎么做网站的301建设设计院网站
  • 自己的服务器 linux centos8部署django项目
  • 做网站注册会员加入实名认证功能广西建设工程质量监督网站
  • 遵义哪里有做网站的外国网站上做Task
  • 动态修改浏览器地址而不刷新页面
  • 车牌识别相机:中哈口岸的通关智能助力
  • 音视频开发远端未发布视频占位图2
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 9 章 STM32 固件库介绍
  • OpenCV 视频处理
  • 有些网站做不了seo物业公司会计好做吗
  • 实惠的制作网站网站首页的功能需求分析
  • ROS2 轨迹规划核心点
  • [GESP202506 五级] 奖品兑换
  • Strassen矩阵乘法算法