编者注:本问题中的代码早于 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的作用域等有关,但我不确定只是将方法调用移到不同行会有什么区别。
iter()
包含对原始切片的引用,在该语句中,它立即被丢弃,因为没有存储在任何地方。编译器会防止使用释放后内存的未定义行为,这几乎肯定会导致错误。 - Chris Morgan