簡體   English   中英

為什么 Rust 中的 for 循環可以遍歷切片或迭代器,而不是數組?

[英]Why can a for loop in Rust iterate over a slice or iterator, but not an array?

為什么 Rust 1.44.0 中的for循環可以迭代切片或迭代器,而不是數組? 例如,以下內容讓我陷入循環:

循環數組:

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
error[E0277]: `[{integer}; 5]` is not an iterator
 --> main.rs:4:20
  |
4 |     for element in a {
  |                    ^ borrow the array with `&` or call `.iter()` on it to iterate over it
  |
  = help: the trait `std::iter::Iterator` is not implemented for `[{integer}; 5]`
  = note: arrays are not iterators, but slices like the following are: `&[1, 2, 3]`
  = note: required by `std::iter::IntoIterator::into_iter`

循環切片(版本 1):

fn main() {
    let a = &[1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

循環切片(版本 2):

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in &a {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

循環遍歷數組迭代器:

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in a.iter() {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

Rust 也可以以這種方式在向量上循環:

fn main() {
    let v = vec![1, 2, 3, 4, 5];

    for element in v {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

編譯器會告訴您原因:因為數組不是迭代器。

為數組實現IntoIterator一個長期存在的問題,不幸的是,添加這將是一個突破性的變化,並且生態系統中存在“只是做”的已知問題,因此在這個問題上進展緩慢。

從 Rust 1.51 開始,你可以使用array::IntoIter

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in std::array::IntoIter::new(a) {
        println!("element={}", element);
    }
}

從 Rust 1.53.0 開始, array的迭代行為發生了變化。 現在我們可以按值迭代數組:

for i in [1, 2, 3] {
    ...
}

該代碼現在是合法的。 宣布 Rust 1.53.0 中查看更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM