如何创建一个无限重复多个值的迭代器?

时间:2015-02-10 16:05:56

标签: iterator rust

使用repeat我可以创建一个重复一个元素的迭代器。但是,如何无限重复多个值? 例如:

let repeat_1 = repeat(1); // 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
let repeat_123 = repeat([1, 2, 3]); // 1, 2, 3, 1, 2, 3, 1, 2, ... // or similar

2 个答案:

答案 0 :(得分:16)

您可以像这样使用.cycle()

fn main() {
    let values = [1, 2, 3];
    let repeat_123 = values.iter().cloned().cycle();
    for elt in repeat_123.take(10) {
        println!("{}", elt)
    }
}

它适用于任何可以克隆的迭代器迭代器,而不是其元素)。

请注意,.cloned()适配器是偶然的!它将切片迭代器的by-reference迭代器元素转换为值。

编写此特定序列的更简单方法是:

let repeat_123 = (1..4).cycle();

答案 1 :(得分:3)

发现:
还可以repeat数组,元组或切片(取决于需要)。

例如:

let repeat_123 = std::iter::repeat([1, 2, 3]); // [1, 2, 3], [1, 2, 3], ...

这个迭代器是嵌套的,但为了展平它,请使用flatmap

let pattern = &[1, 2, 3];
let repeat_123_flat = std::iter::repeat(pattern).flat_map(|x| x.iter());