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];
在第一种语法中,数组的类型会从初始化时第一个元素的 data type 推断得出。
示例:简单数组
以下示例明确指定了数组的大小和数据类型。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 个元素的数组。在变量声明时没有明确指定数据类型。在这种情况下,数组将是 integer 类型。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]; //错误:非常量用于常量
print!("{}",arr[10])
}
编译器将产生异常。这是因为数组的长度必须在编译时已知。这里,变量“N”的值将在运行时确定。换句话说,不能使用变量来定义数组的大小。
然而,以下程序是有效的 −
fn main() {
const N: usize = 20;
// 指针大小
let arr = [0; N];
print!("{}",arr[10])
}
使用 const 关键字前缀的标识符的值在编译时定义,并且不能在运行时更改。usize 是指针大小,因此其实际大小取决于您为该程序编译的架构。