- Rust 教程
- 铁锈 - 主页
- Rust - 简介
- Rust - 环境设置
- Rust - HelloWorld 示例
- Rust - 数据类型
- Rust - 变量
- 铁锈 - 恒定
- Rust - 字符串
- Rust - 运算符
- Rust - 决策
- 铁锈 - 循环
- Rust - 函数
- Rust - 元组
- Rust - 数组
- Rust - 所有权
- Rust - 借用
- 铁锈 - 切片
- Rust - 结构
- Rust - 枚举
- Rust - 模块
- Rust - 收藏
- Rust - 错误处理
- Rust - 泛型类型
- Rust - 输入输出
- Rust - 文件输入/输出
- Rust - 包管理器
- Rust - 迭代器和闭包
- Rust - 智能指针
- Rust - 并发
- Rust 有用的资源
- Rust - 快速指南
- Rust - 有用的资源
- Rust - 讨论
Rust - 数组
在本章中,我们将了解数组以及与其相关的各种功能。在学习数组之前,让我们先看看数组与变量有何不同。
变量有以下限制 -
变量本质上是标量。换句话说,变量声明一次只能包含一个值。这意味着要在程序中存储 n 个值,需要声明 n 个变量。因此,当需要存储更大的值集合时,使用变量是不可行的。
程序中的变量以随机顺序分配内存,因此很难按照声明的顺序检索/读取值。
数组是同构值的集合。简单地说,数组是相同数据类型的值的集合。
数组的特点
数组的特点如下:
数组声明分配连续的内存块。
数组是静态的。这意味着数组一旦初始化就无法调整大小。
每个内存块代表一个数组元素。
数组元素由称为元素下标/索引的唯一整数标识。
填充数组元素称为数组初始化。
数组元素值可以更新或修改,但不能删除。
声明和初始化数组
使用下面给出的语法在 Rust 中声明和初始化数组。
句法
//Syntax1 let variable_name = [value1,value2,value3]; //Syntax2 let variable_name:[dataType;size] = [value1,value2,value3]; //Syntax3 let variable_name:[dataType;size] = [default_value_for_elements,size];
在第一种语法中,数组的类型是在初始化期间根据数组第一个元素的数据类型推断的。
插图:简单数组
以下示例显式指定数组的大小和数据类型。println!() 函数的 {:?} 语法用于打印数组中的所有值。len ()函数用于计算数组的大小。
fn main(){ let arr:[i32;4] = [10,20,30,40]; println!("array is {:?}",arr); println!("array size is :{}",arr.len()); }
输出
array is [10, 20, 30, 40] array size is :4
插图:无数据类型的数组
以下程序声明一个包含 4 个元素的数组。在变量声明期间未显式指定数据类型。在这种情况下,数组的类型为整数。len ()函数用于计算数组的大小。
fn main(){ let arr = [10,20,30,40]; println!("array is {:?}",arr); println!("array size is :{}",arr.len()); }
输出
array is [10, 20, 30, 40] array size is :4
插图:默认值
以下示例创建一个数组并使用默认值-1初始化其所有元素。
fn main() { let arr:[i32;4] = [-1;4]; println!("array is {:?}",arr); println!("array size is :{}",arr.len()); }
输出
array is [-1, -1, -1, -1] array size is :4
插图:带有 for 循环的数组
以下示例迭代数组并打印索引及其相应的值。该循环检索索引 0 到 4(最后一个数组元素的索引)之间的值。
fn main(){ let arr:[i32;4] = [10,20,30,40]; println!("array is {:?}",arr); println!("array size is :{}",arr.len()); for index in 0..4 { println!("index is: {} & value is : {}",index,arr[index]); } }
输出
array is [10, 20, 30, 40] array size is :4 index is: 0 & value is : 10 index is: 1 & value is : 20 index is: 2 & value is : 30 index is: 3 & value is : 40
插图:使用 iter() 函数
iter() 函数获取数组中所有元素的值。
fn main(){ let arr:[i32;4] = [10,20,30,40]; println!("array is {:?}",arr); println!("array size is :{}",arr.len()); for val in arr.iter(){ println!("value is :{}",val); } }
输出
array is [10, 20, 30, 40] array size is :4 value is :10 value is :20 value is :30 value is :40
插图:可变数组
mut关键字可用于声明可变数组。以下示例声明一个可变数组并修改第二个数组元素的值。
fn main(){ let mut arr:[i32;4] = [10,20,30,40]; arr[1] = 0; println!("{:?}",arr); }
输出
[10, 0, 30, 40]
将数组作为参数传递给函数
数组可以按值传递或通过函数引用传递。
插图:按值传递
fn main() { let arr = [10,20,30]; update(arr); print!("Inside main {:?}",arr); } fn update(mut arr:[i32;3]){ for i in 0..3 { arr[i] = 0; } println!("Inside update {:?}",arr); }
输出
Inside update [0, 0, 0] Inside main [10, 20, 30]
插图:通过引用传递
fn main() { let mut arr = [10,20,30]; update(&mut arr); print!("Inside main {:?}",arr); } fn update(arr:&mut [i32;3]){ for i in 0..3 { arr[i] = 0; } println!("Inside update {:?}",arr); }
输出
Inside update [0, 0, 0] Inside main [0, 0, 0]
数组声明和常量
让我们考虑下面给出的示例来理解数组声明和常量。
fn main() { let N: usize = 20; let arr = [0; N]; //Error: non-constant used with constant print!("{}",arr[10]) }
编译器将导致异常。这是因为数组的长度必须在编译时已知。这里,变量“N”的值将在运行时确定。换句话说,变量不能用来定义数组的大小。
但是,以下程序是有效的 -
fn main() { const N: usize = 20; // pointer sized let arr = [0; N]; print!("{}",arr[10]) }
以 const 关键字为前缀的标识符的值在编译时定义,并且不能在运行时更改。usize 是指针大小的,因此它的实际大小取决于您正在为其编译程序的体系结构。