为什么顺序在闭包中很重要?

mer*_*ian 0 rust

在 Rust 中,函数的顺序并不重要,不像 C 或 C++,主函数应该在最后。但对于闭包来说就不一样了,我想知道为什么

例如,此代码编译:

fn main(){
    println!("{}", add_up(1));
}
fn add_up(x: i32) -> i32{
    x + y
}
const y:i32 = 1;
Run Code Online (Sandbox Code Playgroud)

并且此代码无法编译:

fn main(){
    let add_up = |x:i32| x + y;
    let y = 1;
    println!("{}", add_up(1));
}
Run Code Online (Sandbox Code Playgroud)

我知道第一个 y 是一个全局变量,这不是一个公平的比较,但这是我目前能想到的例子。要点是,通常顺序在 rust 中并不重要(main 位于哪里或 add_up 位于哪里),但对于闭包则不一样。为什么?

use*_*342 5

局部变量(可以通过闭包捕获)和常量或静态变量之间的区别在于后者没有“范围”,它们在程序启动之前可用,并且与程序一样持续。另一方面,变量具有明确的作用域 - 引入变量的位置和破坏变量的位置,并且尝试在该区域之外使用它是行不通的。

例如,如果允许捕获尚未创建的变量可能会导致如下无意义的代码:

let c = || x;
println!("{}", c());  // what does this print?
let x = some_function_that_takes_user_input();
let x = x + 1;
{
    let x = 100;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,静态或常量则不存在此问题,因为它不是随时创建的,只要程序存在,它就始终存在。