我目前正在处理一些涉及不同数字集合的计算,例如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
}
不是切片。
这能以某种方式实现而无需依赖其他板条箱吗?