Rust中为何参数state的类型会改变返回闭包的生命周期约束?
核心原因是Rust对impl Trait返回值的泛型参数约束规则
- 所有出现在
impl Trait中的泛型参数(包括生命周期参数),必须被函数的输入参数类型捕获绑定,否则该泛型参数完全由调用方指定,没有任何约束,编译器无法保证返回值的生命周期合法性。
第一个foo函数报错的原因
你写的第一个函数签名:
fn foo<'a, 'b>( state: &'b mut i32, ) -> impl FnMut(&'a str) -> &'static str + 'b
生命周期'a只出现在两个位置:函数的泛型声明、返回的impl FnMut的参数生命周期里,完全没有出现在任何输入参数的类型中。
这意味着'a是完全无约束的生命周期,调用方可以指定任意短的'a,甚至短于函数调用的生命周期。编译器无法保证返回的闭包可以合法接收&'a str类型的参数,因此抛出E0482错误。
第二个foo2函数编译通过的原因
修改后的函数签名:
fn foo2<'a, 'b>( state: &'b mut Option<&'a i32>, ) -> impl FnMut(&'a str) -> &'static str + 'b
此时生命周期'a出现在了输入参数state的类型中,编译器会自动推导约束'a: 'b(即'a的生命周期必须长于等于'b),'a不再是无约束的泛型参数。
返回的闭包生命周期为'b,而'a活得比'b更久,闭包接收&'a str参数完全符合生命周期规则,因此可以正常编译。
补充说明:Rust的生命周期检查是基于函数签名做的,和你函数内部的实现逻辑无关,哪怕你的闭包完全没有用到state和输入的字符串参数,只要签名不符合生命周期规则就会报错。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

