Rust中如何包装带非'static命名生命周期泛型参数的函数
问题原因
- 你提到的“依赖带生命周期的结构体需要加生命周期参数”并不是绝对的,合理使用高阶生命周期绑定可以避免上层结构绑定不必要的生命周期。
- 你现有代码的报错核心是:
Holder<T>中存储的函数指针默认和泛型参数T的生命周期绑定。当你实例化Holder<Transaction>时,编译器会为Transaction推断一个覆盖h整个生命周期的固定生命周期,而你后续在代码块中创建的tran生命周期远短于h,自然不匹配。 - 直接调用
doSomething没问题,是因为该函数本身支持任意生命周期的Transaction参数,没有绑定固定生命周期。
解决方案
使用**高阶生命周期绑定(HRTB)**声明Holder内的函数指针可以处理任意生命周期的输入,不需要和Holder本身的生命周期绑定。
修改后的Holder定义如下:
struct Holder<T> { // for<'a>表示该函数对任意生命周期'a的&'a T参数都可以处理 item: for<'a> fn(&'a T) -> (), } impl <T> Holder<T> { fn new(f: for<'a> fn(&'a T) -> ()) -> Holder<T>{ Holder{item: f} } fn exe(&self,i: &T){ let f = self.item; f(i); } }
剩余代码不需要做任何修改,即可正常编译运行。
这种写法下,Holder结构体本身不需要绑定任何额外的生命周期参数,完全保留了泛型通用性,同时满足你接收任意生命周期Transaction参数的需求。
内容的提问来源于stack exchange,提问作者Dragis
相关产品推荐
相关产品推荐

