Rust如何解决结构体存储泛型切片参数函数指针的报错问题
问题解决方法
错误根因
- 第一个
E0310报错:Box<dyn Fn(&[T]) -> T>中的trait对象默认携带'static生命周期约束(Rust 中未显式标注生命周期的 dyn trait 对象默认要求'static生命周期),你传入的闭包泛型F未声明满足'static约束,编译器无法保证闭包存活时间足够支撑Node结构体的使用。 - 第二次修改后的类型不匹配报错:你手动给闭包输入参数固定了具体生命周期
'a,但Node中定义的闭包是可以接受任意生命周期的输入切片(对应 Rust 高阶 trait 约束for<'a> Fn(&'a [T]) -> T,你写Fn(&[T]) -> T时编译器会自动推导该约束),固定生命周期的闭包和泛用生命周期的闭包类型不兼容。
正确实现
你只需要给闭包泛型F加上'static约束即可,无需手动声明输入参数的生命周期:
use std::fmt::Debug; struct Node<T> { compute_func: Box<dyn Fn(&[T]) -> T> } struct OtherHoldingStruct<T> { // 你的结构体其他字段 } impl<T: Debug + 'static> OtherHoldingStruct<T> { // 给泛型F添加 'static 约束 pub fn create_node<F: Fn(&[T]) -> T + 'static>(_compute_func: F) -> Node<T> { Node { compute_func: Box::new(_compute_func), } } }
可选扩展:允许闭包捕获非'static变量
如果你不需要闭包满足'static要求,允许它捕获其他短生命周期的变量,可以给Node结构体显式添加生命周期参数:
struct Node<'a, T> { compute_func: Box<dyn Fn(&[T]) -> T + 'a> } impl<'a, T: Debug + 'static> OtherHoldingStruct<T> { pub fn create_node<F: Fn(&[T]) -> T + 'a>(_compute_func: F) -> Node<'a, T> { Node { compute_func: Box::new(_compute_func), } } }
内容的提问来源于stack exchange,提问作者Farhan Abrol
相关产品推荐
相关产品推荐

