使用 &array 迭代数组时出现退出代码 101

4
我最近尝试使用不同的迭代方式来测试Rust的循环性能时遇到了这个有趣的错误。如果我使用以下代码进行迭代,我将得到“&[i32; 1000000]不是迭代器;也许尝试调用.iter()或类似的方法”的错误提示。我知道我可以直接使用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);
}

我的问题是:为什么我不能使用&array迭代超过32个元素的数组?

2
请注意,拥有如此大的数组是一个不好的想法,对于大尺寸,请使用vec。 - Stargateur
1个回答

6
就性能而言,它们使用完全相同的Iterator实现,因此没有区别。您可以通过查看 IntoIterator的实现来验证这一点,特别是IntoIter类型。
您不能对某些大小使用&array是因为Rust没有泛型值参数的通用性。这意味着标准库无法表示参数化为某些值的泛型。比如,数组长度。这意味着您需要针对每种可能的数组大小有一个不同的IntoIterator实现。这显然是不可能的,因此标准库仅为一些大小的数组实现它,具体而言,是32个元素大小的数组。

3
如果有其他人感到好奇,这是有关特性(常量泛型)的问题追踪:https://github.com/rust-lang/rust/issues/44580。这项特性将放宽后面提到的限制。尽管还有一段路要走,但最近对此已经有了相当大的进展。 - Joe Clay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接