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

eivgtgni  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

我想把一个接受任意类型迭代器的函数(例如下面例子中的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);
}

字符串

y0u0uwnf

y0u0uwnf1#

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: IntoIterator<Item = String>,
{
    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);
}

字符串
或者这个替代run

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

相关问题