Почему я получаю "Заимствованное значение не достаточно долго" в этом примере?
Я все еще участвую в обучении Ржаву, и был удивлен следующим.
Я не мог понять, почему этот код компилируется:
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9];
let sum = range.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
Пока это не так: (просто перемещая .iter()
вверх)
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9].iter();
let sum = range.map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
Что делает эта ошибка:
test.rs:5:17: 5:36 error: borrowed value does not live long enough
test.rs:5 let range = [1,2,3,4,5,6,7,8,9].iter();
^~~~~~~~~~~~~~~~~~~
Я уверен, что это имеет какое-то отношение к областям Rust и т.д., но я не уверен, что понимаю, как просто перемещение вызова метода в другую строку имеет значение.
Ответы
Ответ 1
Не знаю, как сильно ржавеет, просто догадываясь.
Похоже, массив распадается в конце инструкции let range = [1,2,3,4,5,6,7,8,9].iter();
, поскольку нет переменной, которая удерживает этот вектор. И поэтому у вас есть свисающий итератор, указывающий нигде.
То же самое в С++, где можно создать итератор на объекте, который удаляется после.