Код выхода 101, повторяющийся по массиву с & массивом - PullRequest
0 голосов
/ 03 сентября 2018

Недавно я пытался сравнить Rust для циклов, используя разные стили итераций, когда натолкнулся на эту интересную ошибку. Если я выполню итерацию, используя код ниже, я получу &[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 с &array?

1 Ответ

0 голосов
/ 03 сентября 2018

С точки зрения производительности, нет никакой разницы, поскольку они используют точно такую ​​же реализацию Iterator. В этом можно убедиться, посмотрев реализации IntoIterator; в частности, на IntoIter типах.

Причина, по которой вы не можете использовать &array для некоторых размеров, заключается в том, что в Rust нет параметров универсальных значений для обобщенных элементов. Это означает, что стандартная библиотека не может выразить обобщенные значения, параметризованные по какому-либо значению. Как, скажем, длина массива. Это означает, что вам нужна отдельная реализация IntoIterator для каждого возможного размера массива . Это, очевидно, невозможно, поэтому стандартная библиотека реализует его только для нескольких размеров; в частности, для массивов размером до 32 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...