如何为Rust枚举类型添加命名生命周期参数及绑定泛型内部引用生命周期
问题1解决:补充枚举的生命周期参数
你遇到的报错是因为ComputeNode是带生命周期泛型'a的结构体,在枚举变体中使用时必须传入对应的生命周期参数,需要先给Node枚举本身声明生命周期参数,再透传给内部的ComputeNode,修改后的代码如下:
// 给Node枚举新增生命周期参数'a enum Node<'a, T: Debug + 'static> { Input(InputNode<T>), Compute(ComputeNode<'a, T>), // 给ComputeNode传入生命周期参数'a }
同时需要同步修正ComputeNode中downstream字段的类型,因为现在Node已经带生命周期参数:
struct ComputeNode<'a, T: Debug + 'static> { value: T, downstream: Vec<&'a Node<'a, T>>, // 补充Node的生命周期参数 }
问题2解决:将T的生命周期与Node实例绑定
你需要用泛型生命周期约束T: 'a替换原有的'static约束,该约束的含义是T内部所有引用的存活时间至少不短于生命周期'a,而'a就是和当前Node实例绑定的生命周期,刚好匹配你的需求。完整修改后的代码如下:
// InputNode如果有Debug约束也同步对应即可 struct InputNode<T: Debug> { value: T } // T的约束从'static改为'a,关联T的生命周期和Node的生命周期'a struct ComputeNode<'a, T: Debug + 'a> { value: T, downstream: Vec<&'a Node<'a, T>>, } enum Node<'a, T: Debug + 'a> { Input(InputNode<T>), Compute(ComputeNode<'a, T>), }
这样修改后就不再要求T满足'static约束,T内部引用的生命周期会和持有它的Node实例生命周期绑定,由借用检查器自动校验合法性。
内容的提问来源于stack exchange,提问作者Farhan Abrol
相关产品推荐
相关产品推荐

