Я посмотрел вокруг 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 объект владеет итератором, который перемещается в область моей функции? Я видел несколько примеров синтаксиса времени жизни, которые связывали время жизни параметров и возвращаемых значений вместе, но я не уверен, что делать с этой локальной переменной. Буду признателен за помощь.