这是一个简单的复现(使用2月2日的夜版Rust编译器):
fn main() {
let closure = |_v| {};
// this one works fine
// let closure = |_v: &_| {};
{
let x = 1;
closure(&x);
}
{
let y = 1;
closure(&y);
}
}
错误信息为:
6 | let x = 1;
| - binding `x` declared here
7 | closure(&x);
| ^^ borrowed value does not live long enough
8 | }
| - `x` dropped here while still borrowed
...
11 | closure(&y);
| ------- borrow later used here
这不太合理,因为变量x
没有被closure
捕捉,而只是通过引用传递的参数。
为闭包参数提供一个显式引用_v: &_
可以解决这个问题,但这应该自动推断出来吗?
这是借用检查器的某个错误/限制吗?还是我在这里缺少了更基本的东西?
a
移动到与闭包定义相同的作用域中也可以解决它。https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=66d000d43378f6b8046b557fcf390072 - pigeonhandsfor<'a> |v: &'a i32|
语法。 - Chayim Friedman