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

时间:2014-05-03 05:48:40

标签: 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);
}

虽然这不是:(只是移动.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作用域等有关,但我不确定我是如何通过将方法调用移动到另一行来产生影响的。

2 个答案:

答案 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>

另请参阅: