使用`u32`或`&u32`的迭代器的通用函数

Seb*_*edl 3 generics rust

我正在尝试编写一个处理整数序列的函数.

fn process_one(n: u32) {}

fn process<II>(ii: II)
where
    II: IntoIterator<Item = u32>,
{
    for n in ii {
        process_one(n);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望客户端能够在Vec<u32>不消耗它的情况下传递(process(&v)).不能使用此功能,因为<&Vec<u32> as IntoIterator>::Item&u32; 我不得不通过v.iter().cloned(),这很烦人.

或者,我可以Item = &u32使用绑定和使用process_one(*n),但后来我有相反的问题.

我试图想办法写这个通用,但我无法弄清楚如何.据我所知,没有的AsRef,Borrow,ToOwned,或Deref工作.

我需要的是一种写这个的方法:

fn process<II>(ii: II)
where
    II: IntoIterator<Item = MAGIC>, /* MORE MAGIC */
{
    for n in ii {
        process_one(MAGIC(n));
    }
}
Run Code Online (Sandbox Code Playgroud)

以便所有这些编译:

fn test() {
    let v: Vec<u32> = vec![1, 2, 3, 4];
    process(&v);
    process(v);
    process(1..10);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用自定义特征来做到这一点,但我觉得应该有一种方法没有所有的样板.

小智 9

Borrow 作品:

use std::borrow::Borrow;

fn main() {
    let x = vec![1, 2, 3];
    process(x.iter());
    process(x);
    process(1..3);
}

fn process_one(n: u32) {
    println!("{}", n)
}

fn process<I>(iter: I)
where
    I: IntoIterator,
    I::Item: Borrow<u32>,
{
    for x in iter {
        process_one(*x.borrow());
    }
}
Run Code Online (Sandbox Code Playgroud)