如何创建一个函数,该函数接受 i32s 的迭代器作为值或引用并对它们求和? [英] How do I create a function that accepts an iterator of i32s as either values or references and sums them?
本文介绍了如何创建一个函数,该函数接受 i32s 的迭代器作为值或引用并对它们求和?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有没有办法让单个函数接受值或引用的迭代器?如果没有,有没有办法重写一个或两个测试,以便它们都可以调用相同的 mean
函数?
Is there a way to have a single function that accepts an iterator to either values or references? If not, is there a way to rewrite one or both of the tests so that they can both call the same mean
function?
#[cfg(test)]
mod tests {
#[test]
fn test_mean_of_references() {
let array = [47, 48, 49];
assert_eq!(47.5, super::mean_of_references(46, &mut array.iter()));
}
#[test]
fn test_mean_of_values() {
let array = [46, 47, 48];
let mut iter = array.iter().map(|x| x + 1);
assert_eq!(47.5, super::mean_of_values(46, &mut iter));
}
}
pub fn mean_of_values(x: i32, xs: &mut std::iter::Iterator<Item = i32>) -> f64 {
let (sum, len) = xs.fold((x, 1), |acc, x| (acc.0 + x, acc.1 + 1));
f64::from(sum) / f64::from(len)
}
pub fn mean_of_references(x: i32, xs: &mut std::iter::Iterator<Item = &i32>) -> f64 {
let (sum, len) = xs.fold((x, 1), |acc, x| (acc.0 + x, acc.1 + 1));
f64::from(sum) / f64::from(len)
}
推荐答案
您需要声明您将采用一个通用迭代器,该迭代器产生的值可以添加到 i32
并返回一个 <代码>i32:
You need to declare that you will take a generic iterator that yields values which can be added to an i32
and will return an i32
:
use std::ops::Add;
pub fn mean<I>(x: i32, xs: I) -> f64
where
I: IntoIterator,
i32: Add<I::Item, Output = i32>,
{
let (sum, len) = xs.into_iter().fold((x, 1u32), |acc, x| (acc.0 + x, acc.1 + 1));
f64::from(sum) / f64::from(len)
}
为了增强乐趣,它需要实现IntoIterator
,这意味着调用站点可以更改为
For enhanced fun, it takes in something implementing IntoIterator
, which means that call sites can be changed to
super::mean(46, &array)
super::mean(46, iter)
这篇关于如何创建一个函数,该函数接受 i32s 的迭代器作为值或引用并对它们求和?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文