當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust array用法及代碼示例


本文簡要介紹rust語言中 Primitive Type array 的用法。

一個固定大小的數組,表示為 [T; N] ,用於元素類型 T 和非負編譯時常量大小 N

創建數組有兩種語法形式:

  • 每個元素的列表,即 [x, y, z]
  • 重複表達式 [x; N] ,它生成一個數組,其中包含 Nx 副本。 x 的類型必須是 Copy

請注意,[expr; 0] 是允許的,它會生成一個空數組。但是,這仍將評估 expr ,並立即刪除結果值,因此請注意副作用。

如果元素類型允許,任何大小的數組都會實現以下特征:

如果元素類型允許,大小從 0 到 32(含)的數組實現 Default 特征。作為權宜之計,特征實現是靜態生成的,最大大小為 32。

數組強製切片 ([T]),因此可以在數組上調用切片方法。實際上,這提供了用於處理數組的大部分 API。切片具有動態大小,不會強製轉換為數組。

您可以使用 slice pattern 將元素移出數組。如果您想要一個元素,請參閱 mem::replace

例子

let mut array: [i32; 3] = [0; 3];

array[1] = 1;
array[2] = 2;

assert_eq!([1, 2], &array[1..]);

// This loop prints: 0 1 2
for x in array {
    print!("{} ", x);
}

您還可以迭代對數組元素的引用:

let array: [i32; 3] = [0; 3];

for x in &array { }

您可以使用 slice pattern 將元素移出數組:

fn move_away(_: String) { /* Do interesting things. */ }

let [john, roa] = ["John".to_string(), "Roa".to_string()];
move_away(john);
move_away(roa);

版本

在 Rust 1.53 之前,數組沒有按值實現 IntoIterator ,因此方法調用 array.into_iter() 自動引用到 slice iterator 中。目前,為了兼容性,舊的行為保留在 2015 和 2018 版 Rust 中,按值忽略 IntoIterator 。將來,2015 和 2018 版本的行為可能會與後續版本的行為保持一致。

// Rust 2015 and 2018:

let array: [i32; 3] = [0; 3];

// This creates a slice iterator, producing references to each value.
for item in array.into_iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}

// The `array_into_iter` lint suggests this change for future compatibility:
for item in array.iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}

// You can explicitly iterate an array by value using
// `IntoIterator::into_iter` or `std::array::IntoIter::new`:
for item in IntoIterator::into_iter(array).enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}

從2021版開始,array.into_iter()正常使用IntoIterator進行值迭代,而iter()應該像以前的版本一樣使用引用迭代。

// Rust 2021:

let array: [i32; 3] = [0; 3];

// This iterates by reference:
for item in array.iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}

// This iterates by value:
for item in array.into_iter().enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}

未來的語言版本可能會開始將 2015 和 2018 版的 array.into_iter() 語法與 2021 版相同。因此,在編寫使用這些舊版本的代碼時仍應牢記這一變化,以防止將來出現損壞。完成此操作的最安全方法是避免在這些版本中使用 into_iter 語法。如果版本更新不可行/不理想,則有多種選擇:

  • 使用 iter ,相當於舊行為,創建引用
  • 使用 IntoIterator::into_iter ,相當於 2021 年後的行為(Rust 1.53+)
  • for ... in array.into_iter() { 替換為 for ... in array { ,相當於 2021 年後的行為(Rust 1.53+)
// Rust 2015 and 2018:

let array: [i32; 3] = [0; 3];

// This iterates by reference:
for item in array.iter() {
    let x: &i32 = item;
    println!("{}", x);
}

// This iterates by value:
for item in IntoIterator::into_iter(array) {
    let x: i32 = item;
    println!("{}", x);
}

// This iterates by value:
for item in array {
    let x: i32 = item;
    println!("{}", x);
}

// IntoIter can also start a chain.
// This iterates by value:
for item in IntoIterator::into_iter(array).enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Primitive Type array。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。