Как создать итератор по значению в стеке? - PullRequest
0 голосов
/ 02 октября 2018

Я могу создать потребляющий итератор в куче:

vec![1, 10, 100].into_iter()

Я также могу создать итератор в стеке, который заимствует элементы:

[1, 10, 100].iter()

Но если я напишу это:

[1, 10, 100].into_iter()

Это не потребляющий итератор, поскольку [T; _]::into_iter не существует: IntoIterator реализован только для заимствованной версии (он же слайс).Есть ли простой способ (предпочтительно в std lib) создать потребляющий итератор в стеке?


Я знаю, что [1, 10, 100].iter().cloned() можно сделать, но для этого необходимо, чтобы элементы были клонируемыми.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Очень некрасиво, но технически работает:

for s in [
    Some(String::from("hello")),
    Some(String::from("goodbye"))
].iter_mut().map(|option| option.take().unwrap()) {
    let s: String = s;
    println!("{}", s);
}

Возможно, вы могли бы определить макрос, который делает это более красивым способом.

0 голосов
/ 20 июля 2019

Вы можете иметь макрос, который упаковывает значения в once итератор и цепочки их вместе:

macro_rules! value_iter {
    () => {
        std::iter::empty()
    };
    ($v: expr, $( $rest: expr ), +) => {
        std::iter::once($v).chain(
            value_iter!($($rest),*)
        )
    };
    ($v: expr) => {
        std::iter::once($v)
    };
}

Использование:

#[derive(Debug, PartialEq)]
struct Foo;

let it = value_iter![Foo, Foo, Foo];

let all: Vec<_> = it.collect();
assert_eq!(all, vec![Foo, Foo, Foo]);

Известный недостаток состоит в том, что итератор не будет итератором точного размера, и поэтому компилятор может пропустить некоторые очевидные оптимизации.

Playground

0 голосов
/ 02 октября 2018

Есть ли простой способ (предпочтительно в std lib) создать потребляющий итератор в стеке?

Нет.

простой способ (предпочтительно в std lib) для создания потребляющего итератора в стеке?

Да.Используйте ящик типа stack или smallvec, которые предоставляют типы массивов, которые реализуют IntoIterator.

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