为什么我在这个例子中得到"借来的价值不够长寿"?

Era*_*dan 12 rust borrow-checker rust-obsolete

编者注:此问题中的代码早于Rust 1.0.此代码的等效现代版本按原样编译.

我还在学习Rust的步骤,并对以下内容感到惊讶.

我无法理解为什么这段代码会编译:

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);
}
Run Code Online (Sandbox Code Playgroud)

虽然这不是:(只是向上移动.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);
}
Run Code Online (Sandbox Code Playgroud)

这会导致此错误:

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();
                          ^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我确定它与Rust作用域等有关,但是我不确定我是如何通过将方法调用移动到另一行来产生影响的.

c-s*_*ile 10

数组在let range = [1,2,3,4,5,6,7,8,9].iter();语句结束时被销毁,因为没有包含该向量的变量.这会导致悬浮的迭代器无处可寻.

在C++中也是如此,可以在之后删除的对象上创建迭代器.

  • 这是正确的:`iter()`包含对原始切片的引用,并且在该语句中它立即被删除,因为它没有存储在任何地方.编译器然后将您从未定义但几乎肯定是免费使用的不良行为中拯救出来. (5认同)