Rust - 数组

在本章中,我们将了解数组以及与之相关的各种功能。 在学习数组之前,让我们看看数组与变量有何不同。

变量有以下限制 −

  • 变量本质上是标量。 换句话说,变量声明一次只能包含一个值。 这意味着要在程序中存储 n 个值,需要声明 n 个变量。 因此,当需要存储更大的值集合时,使用变量是不可行的。

  • 程序中的变量以随机顺序分配内存,因此很难按照声明的顺序检索/读取值。

数组是同构值的集合。 简单地说,数组是相同数据类型的值的集合。

数组的特征

数组的特点如下 −

  • 数组声明分配连续的内存块。

  • 数组是静态的。 这意味着数组一旦初始化就无法调整大小。

  • 每个内存块代表一个数组元素。

  • 数组元素由称为元素下标/索引的唯一整数标识。

  • 填充数组元素称为数组初始化。

  • 数组元素值可以更新或修改,但不能删除。

声明和初始化数组

使用下面给出的语法在 Rust 中声明和初始化数组。

语法

//语法1
let variable_name = [value1,value2,value3];

//语法2
let variable_name:[dataType;size] = [value1,value2,value3];

//语法3
let variable_name:[dataType;size] = [default_value_for_elements,size];

在第一种语法中,数组的类型是在初始化期间从数组第一个元素的数据类型推断出来的。

示例:简单数组

以下示例显式指定数组的大小和数据类型。 {:?} syntax of the 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 是指针大小的,因此它的实际大小取决于您正在为其编译程序的体系结构。