Rust 为什么我会得到;借来的价值活得不够长。”;在这个例子中?
编者按:此问题中的代码早于Rust 1.0。此代码的等效现代版本按原样编译 我仍在学习锈菌,并对以下几点感到惊讶 我不明白为什么这段代码会编译:Rust 为什么我会得到;借来的价值活得不够长。”;在这个例子中?,rust,borrow-checker,rust-obsolete,Rust,Borrow Checker,Rust Obsolete,编者按:此问题中的代码早于Rust 1.0。此代码的等效现代版本按原样编译 我仍在学习锈菌,并对以下几点感到惊讶 我不明白为什么这段代码会编译: 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(); printl
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()
)
这将导致此错误:
test.rs:5:17:5:36错误:借来的值寿命不够长
test.rs:5 let range=[1,2,3,4,5,6,7,8,9].iter();
^~~~~~~~~~~~~~~~~~~
我确信这与锈蚀范围等有关,但我不确定我是否理解仅仅将方法调用移动到另一行是如何产生差异的 数组在
let range=[1,2,3,4,5,6,7,8,9]的末尾被销毁代码>语句,因为没有保存该向量的变量。这将导致挂起的迭代器不指向任何地方
同样的情况发生在C++中,在创建对象后,可以在被删除的对象上创建迭代器。
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。这是正确的:iter()
包含对原始切片的引用,在该语句中,它会立即被删除,因为它没有存储在任何地方。然后,编译器将您从未定义但几乎肯定是“免后使用”的不良行为中解脱出来。有关设计空间的更多讨论,请参见本博客文章:(从我发布的答案迁移)
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);
}