Почему я получаю "Заимствованное значение не достаточно долго" в этом примере?

Я все еще участвую в обучении Ржаву, и был удивлен следующим.

Я не мог понять, почему этот код компилируется:

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();, поскольку нет переменной, которая удерживает этот вектор. И поэтому у вас есть свисающий итератор, указывающий нигде.

То же самое в С++, где можно создать итератор на объекте, который удаляется после.