Rust trait对象指针生命周期报错疑问:为何存在生命周期约束?
问题解析与解决
首先明确核心规则:Rust中不带显式生命周期标注的 trait 对象(如dyn ToString),默认会被编译器推断为带有'static生命周期约束。也就是说,你写的*const dyn ToString其实等价于*const dyn ToString + 'static,这要求该指针指向的 trait 对象必须能存活至程序结束。
再拆解你的函数逻辑:
- 输入参数
ptrs: &[*const dyn ToString]是一个切片引用,它自带一个生命周期(编译器标注为'1)。 - 切片里的每个
*const dyn ToString,其指向的 trait 对象的生命周期其实和这个切片的生命周期'1绑定——因为切片是借来的,里面的指针指向的对象可能依赖切片的存活周期。 - 但你返回的
Vec<*const dyn ToString>被默认要求是'static的,这就强制要求输入的'1必须比'static更久,这显然不可能,所以编译器抛出了生命周期不匹配的错误。
修复方案
按照编译器提示,给返回值的 trait 对象加上'_生命周期标注:
fn to_pointer_vec(ptrs: &[*const dyn ToString]) -> Vec<*const dyn ToString + '_> { let mut vec: Vec<*const dyn ToString + '_> = Vec::new(); for &ptr in ptrs { vec.push(ptr); } vec }
'_是生命周期省略的语法糖,它会自动推导为和输入参数ptrs的生命周期一致。这样返回的 Vec 里的指针,其指向的 trait 对象只需要存活到和输入切片相同的周期,就符合 Rust 的安全规则了。
你也可以显式写出生命周期参数,让逻辑更清晰:
fn to_pointer_vec<'a>(ptrs: &'a [*const dyn ToString + 'a]) -> Vec<*const dyn ToString + 'a> { let mut vec = Vec::new(); for &ptr in ptrs { vec.push(ptr); } vec }
内容的提问来源于stack exchange,提问作者keyboardman
相关产品推荐
相关产品推荐

