如何创建一个函数,该函数接受 i32s 的迭代器作为值或引用并对它们求和? [英] How do I create a function that accepts an iterator of i32s as either values or references and sums them?

查看:42
本文介绍了如何创建一个函数,该函数接受 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆