首页 > 解决方案 > 将生命周期传递给结构

问题描述

我有这样的代码:

pub trait Action {
    fn execute(&self);
}

struct AddAction<'a> {
    rpn_calculator: &'a RpnCalculator
}

struct DeductAction<'a> {
    rpn_calculator: &'a RpnCalculator
}

impl Action for DeductAction<'_> {
    fn execute(&self) {
        // ...
    }
}

impl Action for AddAction<'_> {
    fn execute(&self) {
        // ...
    }
}

impl<'a> RpnCalculator {
    fn actions(&self) -> Vec<Box<dyn Action + 'a>> {
        let mut actions: Vec<Box<dyn Action + 'a>> = vec![
            Box::new(AddAction { rpn_calculator: &self })
            Box::new(AddAction { rpn_calculator: &self })
            // ...
        ];
        // ...
        actions
    }
}

我的代码的目的是 RpnCalculator.actions() 应该创建一些实现特征 Action 的结构的实例并返回包含这些实例的向量。这些结构有一个属性 rpn_calculator,它是对 RpnCalculator 的引用。RpnCalculator.actions() 应该将 self(创建它的 RpnCalculator)放入此引用中。

现在我得到的错误是“无法推断出适当的生命周期”。我在创建添加到向量的实例的行中收到此错误:

Box::new(AddAction { rpn_calculator: &self })

出于这个原因,我'a在向量声明中,但它仍然不起作用。

标签: rustreferencetraitslifetime

解决方案


您可能应该使用fn actions(&'a self),因为 'a您使用dyn Action + 'a的生命周期与RpnCalculator.


推荐阅读