闭包隐式类型下的生命周期推断错误技术问询
闭包参数未显式标注类型引发的借用检查错误解析
复现代码
fn main() { let closure = |_v| {}; // 以下写法可正常运行 // 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
原因分析
这并非借用检查器的bug,而是Rust闭包类型推断的规则导致的:
- 当未给闭包参数指定类型时,Rust会依据第一次调用闭包的参数确定闭包的具体类型。第一次调用传递的
&x生命周期仅限于第一个代码块,因此Rust会推断闭包参数的引用生命周期与x完全绑定。 - 第二次调用传递的
&y属于另一个代码块,生命周期和x完全不同,此时闭包已被固定为只能接受x生命周期的引用,自然触发生命周期不匹配的错误。
显式指定_v: &_时,相当于告知Rust闭包可以接受任意生命周期的引用(本质是泛型生命周期),此时闭包会被推断为泛型版本,两次调用分别用对应变量的生命周期实例化泛型,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Andrey Hanin
相关产品推荐
相关产品推荐

