rust - 为什么我在这个例子中得到 "Borrowed value does not live long enough"?

标签 rust borrow-checker rust-obsolete

Editor's note: The code in this question predates Rust 1.0. The equivalent modern version of this code compiles as-is.

我在学习 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);
}

虽然这不是:(只是将 .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 作用域等有关,但我不确定我是否理解将方法调用移动到不同的行会有什么不同。

最佳答案

数组在 let range = [1,2,3,4,5,6,7,8,9].iter(); 语句结束时被销毁没有保存该向量的变量。这会导致悬垂的迭代器指向任何地方。

在 C++ 中也有同样的情况,可以在之后删除的对象上创建迭代器。

关于rust - 为什么我在这个例子中得到 "Borrowed value does not live long enough"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440793/

相关文章:

function - 可以声明将在 Rust 中对未使用的结果发出警告的函数吗?

rust - 向结构添加通用参数后借用检查器错误

arrays - 使用常量表达式声明数组的大小

rust - 创建一个临时的,在使用时被释放

rust - 为什么我在 Rust Playground 上得到 "Response was not JSON"?

multithreading - 为什么 Rust 互斥锁似乎没有给最后想要锁定它的线程锁?

struct - 解构在函数参数中包含借用的结构

rust - setter/getter 中的可变借用时间不够长

rust - 在单独的模块中使用时使用未声明的类型或模块 `std`

rust - 如何遍历盒装迭代器?