当我遇到这个有趣的错误时,我最近试图使用不同的迭代样式对Rust的循环进行基准测试。如果我使用下面的代码进行迭代,我将得到kaminari
。 我知道我可以只使用&[i32; 1000000] is not an iterator; maybe try calling .iter() or a similar method
,但是我正在尝试找出速度更快的iter()
或iter()
。
代码:
&array
我的问题是:为什么我不能使用extern crate time;
fn main() {
let array: [i32; 1000000] = [0; 1000000]; // This will produce an error
// let array: [i32; 32] = [0; 32] produces no error
let start_time = time::precise_time_s();
for _x in &array {
}
println!("{}", time::precise_time_s() - start_time);
}
遍历大于32的数组?
答案 0 :(得分:6)
就性能而言,没有什么区别,因为它们使用完全相同的Iterator
实现。您可以通过查看implementations of IntoIterator
来验证这一点;具体来说,是IntoIter
类型。
对于某些大小,不能使用&array
的原因是因为Rust没有泛型的泛型值参数。这意味着标准库无法表达通过某些值参数化的泛型。就像数组长度一样。这意味着您需要针对{em>每种可能的数组大小的IntoIterator
的不同实现。这显然是不可能的,因此标准库仅将其实现为几种大小。具体来说,适用于最大32个元素的数组。