如何构造和传递迭代器的迭代器?

时间:2018-11-06 16:39:54

标签: rust

我正在尝试通过在其中实现简单算法来欺骗Rust。我设法制作了一个通用的merge_sorted,最终得到了以下签名:

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

这似乎是自己编译的。签名对我来说很有意义,因为该函数消耗了顶层迭代器,并且它也返回了所有迭代器。但是,我无法构造有效的值以传递给此函数:

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

按预期,此示例中的vectors具有以下类型:

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

这是我收到的错误消息:

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`

&来自哪里?

1 个答案:

答案 0 :(得分:2)

var currentDirectory = Directory.GetCurrentDirectory(); var driverService = ChromeDriverService.CreateDefaultService(currentDirectory); driverService.Start(); var driver = new ChromeDriver(driverService); 借用其中包含的项目,因此您要遍历未实现Vec::iter的借用迭代器(&std::slice::Iter)。要使用矢量来拥有商品的所有权,必须调用Iterator

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()); } 来简化API的使用:

IntoIterators