将生命传递给结构

问题描述

我有这样的代码

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,但是它仍然不起作用。

解决方法

您可能应该使用fn actions(&'a self),因为生存期 您在'a中使用的dyn Action + 'a与生命周期有关 RpnCalculator中的一个。