Попытка написать обобщенную функцию c, которая принимает и использует IntoIterator в качестве параметра - PullRequest
0 голосов
/ 14 марта 2020

Я посмотрел вокруг Google и SO, чтобы найти ответ на этот вопрос, но я не смог его найти. Я пытаюсь понять итераторы, поэтому я могу использовать их в качестве параметров, а не брать Ve c или какую-то другую конкретную коллекцию. В этом примере я использую числа с плавающей точкой.

Я знаю, что суммы могут быть вычислены с использованием стандартной библиотеки. Я хочу понять, как использовать 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);
}

Компилятор возвращает следующее при вызове into_iter ().

cannot move out of `*values` which is behind a mutable reference(E0507)

Означает ли это Ve c объект владеет итератором, который перемещается в область моей функции? Я видел несколько примеров синтаксиса времени жизни, которые связывали время жизни параметров и возвращаемых значений вместе, но я не уверен, что делать с этой локальной переменной. Буду признателен за помощь.

...