如何构造和传递迭代器的迭代器? [英] How can I construct and pass an iterator of iterators?

查看:48
本文介绍了如何构造和传递迭代器的迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过在 Rust 中实现简单的算法来理解它.我设法制作了一个通用的 merge_sorted,它最终具有以下签名:

I am trying to grok Rust by implementing simple algorithms in it. I managed to make a generic merge_sorted, which ended up having the following signature:

fn merge_sorted<IL, ILL, I: Ord>(mut arrays: ILL) -> Vec<I>
where
    IL: Iterator<Item = I>,
    ILL: Iterator<Item = IL>,
{
    // ...
}

这似乎是自己编译的.签名对我来说很有意义,因为该函数使用顶级迭代器,以及它返回的所有迭代器.但是,我无法构造一个有效的值来传递给这个函数:

This seems to be compiling on its own. The signature makes sense to me, as the function consumes the top-level iterator, and all the iterators it returns too. However, I am unable to construct a valid value to pass to this function:

fn main() {
    let v1 = vec![1, 2];
    let vectors = vec![v1.iter()];
    merge_sorted(vectors.iter());
}

正如预期的那样,此示例中的 vectors 具有以下类型:

As expected, vectors in this sample has the type:

std::vec::Vec<std::slice::Iter<'_, i32>>

这是我收到的错误消息:

This is the error message I get:

error[E0277]: the trait bound `&std::slice::Iter<'_, {integer}>: std::iter::Iterator` is not satisfied
  --> src\main.rs:58:5
   |
58 |     merge_sorted(vectors.iter());
   |     ^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator; maybe try calling `.iter()` or a similar method
   |
   = help: the trait `std::iter::Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`
note: required by `merge_sorted`

& 来自哪里?

推荐答案

Vec::iter 借用它包含的项目,因此您正在迭代借用的迭代器(&std::slice::Iter) 没有实现 Iterator.要使用向量以获得项目的所有权,您必须调用 Vec::into_iter:

Vec::iter borrows the items it contains, so you are iterating over borrowed iterators (&std::slice::Iter) that do not implement Iterator. To consume a vector in order to have the ownership of the items, you must call Vec::into_iter:

fn main() {
    let v1 = vec![1, 2];
    let vectors = vec![v1.iter()]; // You can use `into_iter` there to iterate over ints.
    merge_sorted(vectors.into_iter());
}

您还可以要求 IntoIterators 来简化 API 的使用:

You can also require IntoIterators that can make easier the usage of your API:

fn merge_sorted<IterT, IterIterT, T: Ord>(mut arrays: IterIterT) -> Vec<T>
where
    IterT: IntoIterator<Item = T>,
    IterIterT: IntoIterator<Item = IterT>,
{
    panic!();
}

fn main() {
    let v1 = vec![1, 2];
    let vectors = vec![v1];
    merge_sorted(vectors);
}

这篇关于如何构造和传递迭代器的迭代器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆