如何在不使用任何包装箱的情况下编写通用函数来计算平均值?

时间:2019-02-27 10:34:44

标签: rust

我目前正在处理一些涉及不同数字集合的计算,例如Vec<u16>Vec<u32>VecDeque<16>等。我需要多次计算这些集合的平均值,因此我想包装一下:

let avg = numbers.map(|x| *x as u32).sum::<u32>() as f32 / numbers.len() as f32;

进入一个函数,其中numbers可以是任何集合。

我尝试过:

fn average<T>(numbers: &T) -> f32 {
    numbers.map(|x| *x as u32).sum::<u32>() as f32 / numbers.len() as f32
}

但是那当然是行不通的,因为T不一定要实现Iterator。所以我加了(MVCE):

use std::collections::VecDeque;

fn average<T>(numbers: &T) -> f32
where
    T: std::iter::Iterator,
    u32: std::iter::Sum<<T as std::iter::Iterator>::Item>,
    u16: std::iter::Sum<<T as std::iter::Iterator>::Item>,
{
    numbers.sum::<u32>() as f32 / numbers.count() as f32
}

fn main() {
    let mut input = VecDeque::new();
    input.push_back(1);
    input.push_back(2);
    let _avg = average(&input.iter());
}

但是我得到了std::iter::Sum<&u32>尚未实现特征u16,并且我认为这还是行不通的,因为count()会消耗{ {1}}。

因此,我决定只对片进行多个功能。例如:

Iterator

但这也不令人满意,因为fn average_u16<T>(numbers: &[u16]) -> f32 { numbers.map(|x| *x as u32).sum::<u32>() as f32 / numbers.len() as f32 } 不是切片。

这能以某种方式实现而无需依赖其他板条箱吗?

0 个答案:

没有答案