Rust 中如何传递一个以迭代器作为函数参数的函数?

问题描述 投票:0回答:1

我想将一个采用某种类型的任意迭代器的函数(例如下面示例中的

String
)传递到另一个函数中,但我不知道如何指定此类函数的类型。

这是我想要实现的目标的最小(非工作)示例。编译器无法推断

I
的类型。

fn process<I>(lines: I)
where
    I: Iterator<Item = String>, // or IntoIterator
{
    for line in lines {
        println!("{}", line.to_uppercase());
    }
}

fn run<F, I>(processor: F)
where
    I: Iterator<Item = String>,
    F: Fn(I),
{
    let v = vec![
        String::from("aaa"),
        String::from("BBB"),
        String::from("cCcC"),
    ];
    processor(v.iter());
}

fn main() {
    run(process);
}
generics rust higher-order-functions
1个回答
0
投票

run
没有传递任何
Iterator<Item = String>
,它当前正在传递一个非常具体的
std::slice::Iter<'_, String>
,因此您不能在其上使用通用的
I: Iterator
。无论如何,
slice::Iter<'_, String>
实现了
Iterator<Item = &String>
而不是
Iterator<Item = String>
(注意附加/不存在的
&
),所以
process
甚至不接受它。

你可能想写这个:

fn process<I>(lines: I)
where
    I: Iterator<Item = String>, // or IntoIterator
{
    for line in lines {
        println!("{}", line.to_uppercase());
    }
}

fn run<F>(processor: F)
where
    F: Fn(std::vec::IntoIter<String>),
{
    let v = vec![
        String::from("aaa"),
        String::from("BBB"),
        String::from("cCcC"),
    ];
    processor(v.into_iter());
}

fn main() {
    run(process);
}
© www.soinside.com 2019 - 2024. All rights reserved.