Rust can';t捕获fn项中的动态环境,但代码已在| |{}闭包中

Rust can';t捕获fn项中的动态环境,但代码已在| |{}闭包中,rust,Rust,我已将有问题的代码精简为以下示例: fn foo(input_vector: Vec<()>) { const bar: Option<()> = [] .iter() .map(|_| { input_vector; }) .nth(0); } fn main() { foo(vec![]); } 如果我已经在使用闭包,为什么编译器要告诉我使用闭包?下面是一个更简短的示例,它会产生相同的错误: fn f

我已将有问题的代码精简为以下示例:

fn foo(input_vector: Vec<()>) {
    const bar: Option<()> = []
        .iter()
        .map(|_| { input_vector; })
        .nth(0);
}

fn main() {
    foo(vec![]);
}

如果我已经在使用闭包,为什么编译器要告诉我使用闭包?

下面是一个更简短的示例,它会产生相同的错误:

fn foo(a: i32) {
    const b: i32 = a;
}
问题是
const
没有声明局部变量;它声明了一个全局常量(尽管它的作用域可以是函数或块)。常数意味着始终具有相同的值,因此它们的值不能依赖于参数


如果您想要一个不可变的局部变量,请使用
let

我写了太多的TypeScript,甚至没有注意到这一点。能够在非全局作用域中声明
const
的用例是什么?@stuffy这样“它可以被作用域限定为函数或块”。为什么要在一个比你需要的更广的范围内做一些事情呢?好吧,所以这是一个严格意义上的可见性问题。在我使用的大多数语言中,定义全局与定义局部是一样的,也就是说,如果您试图这样定义它的范围,那么每次调用都会产生赋值的成本。我发现Rust赋予您更好的控制权,这样您可以在更窄的范围内拥有常数,但仍然只对它们求值一次。谢谢