Rust中带生命周期的iter-map-collect模式实现问题
解决Vec.mapcollect的生命周期推导问题
要让mapcollect能像原生iter().map(...).collect()一样自动推导生命周期,核心是把闭包参数的生命周期与调用者(self)的生命周期绑定起来。修改后的实现如下:
pub trait IterMap<T> { fn mapcollect<'a, F, U>(&'a self, f: F) -> Vec<U> where F: Fn(&'a T) -> U; } impl<T> IterMap<T> for Vec<T> { fn mapcollect<'a, F, U>(&'a self, f: F) -> Vec<U> where F: Fn(&'a T) -> U, { self.iter().map(f).collect() } }
原理说明
原实现的问题在于,闭包参数&T的生命周期是匿名且独立的,Rust无法将其与self的生命周期关联。当闭包返回引用类型时,编译器无法确定该引用的有效范围,因此报错。
修改后,我们通过生命周期参数'a将self的引用(&'a self)、闭包的参数(&'a T)以及闭包返回值U的生命周期绑定在一起。这样Rust就能像处理原生iter().map().collect()一样,自动推导返回的Vec<U>中引用的生命周期必须依赖于self的生命周期。
验证示例
现在之前的生命周期场景可以正常编译:
let v: Vec<Vec<i32>> = vec![vec![1, 2], vec![3, 4]]; let v_slice: Vec<&[i32]> = v.mapcollect(|x| x.as_slice());
这里闭包接收的x是&'a Vec<i32>,as_slice()返回的&'a [i32]会被正确关联到v的生命周期,编译器能顺利推导v_slice的有效范围。
内容的提问来源于stack exchange,提问作者AdelNick
相关产品推荐
相关产品推荐

