如何将一生应用于VecDeque<Box<dyn Trait>>?



我正在尝试创建一个结构的VecDeque,这些结构都实现了Animal特征。这段代码有效,但我不明白为什么添加' 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>>,
}   

编译器将检查您的生存期注释是否有意义,并强制引用不能超过对象的生存期。

最新更新