如何编写采用“u32”或“&u32”的任何迭代器的通用函数?

2023-12-06

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

fn process_one(n: u32) {}

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

我希望客户能够通过Vec<u32>不消耗它(process(&v))。无法使用此功能,因为<&Vec<u32> as IntoIterator>::Item is &u32;我必须通过v.iter().cloned()相反,这很烦人。

或者,我可以进行绑定Item = &u32并使用process_one(*n),但后来我遇到了相反的问题。

我试图想出一种通用的方法来写这个,但我不知道如何写。据我所知,没有一个AsRef, Borrow, ToOwned, or Deref work.

我需要的是一种写法:

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

这样所有这些都可以编译:

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

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


Borrow works:

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());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写采用“u32”或“&u32”的任何迭代器的通用函数? 的相关文章

随机推荐