Generics 尝试编写一个通用函数,该函数接受并使用IntoIterator作为参数

Generics 尝试编写一个通用函数,该函数接受并使用IntoIterator作为参数,generics,rust,iterator,Generics,Rust,Iterator,我在谷歌搜索了一下,想找到一个答案,但我找不到。我试图理解迭代器,所以我可以将它们用作参数,而不是使用Vec或其他具体集合。在这个例子中,我使用了浮动 我知道可以使用标准库计算总和。我希望了解如何使用这个替代实现使用IntoIterators fn sample_size_sum<T, I>(values: &mut I, is_sample: bool) -> (u32, T) where I: IntoIterator<Item = T> + s

我在谷歌搜索了一下,想找到一个答案,但我找不到。我试图理解迭代器,所以我可以将它们用作参数,而不是使用Vec或其他具体集合。在这个例子中,我使用了浮动

我知道可以使用标准库计算总和。我希望了解如何使用这个替代实现使用IntoIterators

fn sample_size_sum<T, I>(values: &mut I, is_sample: bool) -> (u32, T)
    where I: IntoIterator<Item = T> + std::iter::FromIterator<T>, T: num::Float + std::ops::AddAssign + Copy
{
    let mut it = values.into_iter();
    let mut sum: T = num::Float::nan();
    let mut sample_size = 0;
    let mut first = true;

    while let Some(value) = it.next()
    {
        if !value.is_nan()
        {
            sample_size += 1;
            if first
            {
                sum = value;
                first = false;
            }
            else
            {
                sum += value;
            }
        }
    }

    if is_sample && sample_size > 0
    {
        sample_size -= 1;
    }

    return (sample_size, sum);
}

fn main() 
{
    let mut numbers = vec![1.0, 2.0, 3.0, std::f64::NAN, 5.0];
    let (sample_size, sum) = sample_size_sum(&mut numbers, false);
}


这是否意味着Vec对象拥有正在移动到我的函数范围的迭代器?我见过一些生命周期语法的示例,它们将参数的生命周期和返回值绑定在一起,但我不确定如何处理这个局部变量。我非常感谢您的帮助。

在编译过程中,它将向量的所有权转移到sample\u size\u sum的范围;使其在以后的主版本中无效。这就是为什么我试图使用参考资料。有没有办法不移动所有权就能做到这一点?谢谢。我对语法有点困惑。values参数的类型为I(不是&I),但它接受引用。这是从其他语法推断出来的吗?我很感激你的回答。我还在学习。我正在使用InIterator,因为我读到它更灵活。我可以进行多次迭代,就像一个函数调用另一个函数进行一些预处理一样。如果我错了,请纠正我,但如果我只有一个迭代器,我将无法做到这一点。当然,在某些情况下,我不希望出现多次传球。如果你有其他想法或链接,我很乐意阅读。编辑:对不起,我误读了你对FromIterator的评论。它是在我试图编译东西时添加的,它删除了一些错误,指出我缺少这个特性。从那时起,代码一直在变形。我想我不需要它。:-)当你对rust说我想要实现迭代器的东西时,它可以是任何东西,;)看见
cannot move out of `*values` which is behind a mutable reference(E0507)