编者注:此问题中的代码早于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);
}
虽然这不是:(只是移动.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作用域等有关,但我不确定我是如何通过将方法调用移动到另一行来产生影响的。
答案 0 :(得分:10)
数组在let range = [1,2,3,4,5,6,7,8,9].iter();
语句的末尾被销毁,因为没有包含该向量的变量。这会导致悬浮的迭代器无处可寻。
在C ++中也是如此,可以在之后删除的对象上创建迭代器。
答案 1 :(得分:0)
在现代Rust中,等效代码会编译:
fn main() {
let range = [1, 2, 3, 4, 5, 6, 7, 8, 9].iter();
let sum: i32 = range.map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
这是因为像数组文字一样,文字现在可以根据需要自动提升为静态变量。 iter
的结果现在是std::slice::Iter<'static, i32>
。
另请参阅: