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 是指標大小的,因此它的大小取決於您編譯程式的架構。

廣告