如何将生命周期应用到 VecDeque<Box<dyn Trait>>?

How to apply a lifetime to VecDeque<Box<dyn Trait>>?

我正在尝试创建一个全部实现 Animal 特征的结构 VecDeque。这段代码有效,但我不明白为什么添加 ' static 修复它以及如何让它使用 'a 代替。

pub trait Animal {
    fn says(self) -> Option<String>;
}

use std::collections::VecDeque;

pub struct Zoo {
    list: VecDeque<Box<dyn Animal>>,
}

impl Zoo {
    pub fn new() -> Zoo {
        Zoo {
            list: VecDeque::new(),
        }
    }

    pub fn add<T>(&mut self, animal: T)
    where
        T: Animal + 'static,
    {
        self.list.push_back(Box::new(animal));
    }
}

两个问题:

  1. 有人可以解释一下如何正确使用 'a 以及它是如何工作的/这意味着什么?而且我猜为什么我什至需要在这里度过一生(是因为我在使用 Box)吗?
  2. 我也很困惑为什么我必须使用 #[path="..."] 因为没有它,它会要求我将文件移动到 src/lib/animal.rs 但是当我移动它时,它仍然不起作用。

正如已经指出的那样,Box<dyn Animal> 等同于 Box<dyn Animal + 'static>,这意味着指向在整个程序中有效的东西(如字符串文字)的指针。这可能不是你想要的。

你希望你的 Zoo 不能比你的 Animal 活得更久。 (这是编译器将强制执行的)。所以你用生命周期 'a 注释 Zoo 并且你要求存储在 Zoo 中的每个 Animal 至少与 'a 一样长:

pub struct Zoo<'a> {
    animals: VecDeque<Box<dyn Animal + 'a>>,
}   

编译器将检查您的生命周期注释是否有意义并强制引用不能比对象长寿。