实现成对迭代器

use*_*095 1 iterator rust

(Option<T>, T)我在为接受迭代器并返回像这样成对迭代的迭代器的函数编写代码时遇到问题

a = [1,2,3]
assert pairwise(a) == `[(None, 1), (Some(1), 2), (Some(2), 3)]
Run Code Online (Sandbox Code Playgroud)
fn pairwise<I, T>(&xs: &I) -> I
where
    I: Iterator<Item = T>,
{
    [None].iter().chain(xs.iter().map(Some)).zip(xs.iter())
}

fn main() {
    let data: Vec<i32> = vec![1, 2, 3];
    let newdata: Vec<Option<i32>, i32> = pairwise(&data).collect();
    println!("{:?}", newdata);
}
Run Code Online (Sandbox Code Playgroud)
error[E0599]: no method named `iter` found for type `I` in the current scope
 --> src/main.rs:3:28
  |
3 |     [None].iter().chain(xs.iter().map(Some)).zip(xs.iter())
  |                            ^^^^
  |
Run Code Online (Sandbox Code Playgroud)

不知道为什么xs不可迭代。我在条款里已经说了where不是吗?

She*_*ter 6

fn pairwise<I, T>(&xs: &I) -> I
Run Code Online (Sandbox Code Playgroud)

这没有道理。请参阅返回迭代器(或任何其他特征)的正确方法是什么?用作 for 循环变量时,`e1` 和 `&e2` 有什么区别?

I: Iterator<Item = T>,
Run Code Online (Sandbox Code Playgroud)

没有理由指定ItemT.

[None].iter()
Run Code Online (Sandbox Code Playgroud)

最好使用iter::once.

xs.iter()
Run Code Online (Sandbox Code Playgroud)

标准库中没有定义iter方法的特征。也许你的意思是IntoIterator

let data: Vec<i32> = vec![1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

没有理由在这里指定类型;i32是默认的整型。

Vec<Option<i32>, i32>
Vec<Option<i32>, i32>> // original version
Run Code Online (Sandbox Code Playgroud)

这不是 的有效类型Vec,并且您的原始形式甚至没有平衡符号。


毕竟,你面临着艰难的选择。您的示例代码传入一个迭代器,该迭代器引用切片,但您已经编写了断言,以便您期望返回非引用。您还尝试使用任意迭代器两次;不能保证这样的事情是可行的。

我看到的最通用的形式是:

fn pairwise<I, T>(&xs: &I) -> I
Run Code Online (Sandbox Code Playgroud)

也可以看看:


归档时间:

查看次数:

3704 次

最近记录:

4 年 前