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赋予您更好的控制权,这样您可以在更窄的范围内拥有常数,但仍然只对它们求值一次。谢谢