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/