我正在尝试创建结构的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));
}
}
两个问题:
'a
以及它如何工作/其含义是什么?而且我猜为什么我在这里甚至需要一辈子(是因为我在使用Box)?#[path="..."]
,因为如果没有它,它会要求我将文件移动到src/lib/animal.rs
,但是当我将其移动时,仍然无法使用。答案 0 :(得分:0)
正如已经指出的,Box<dyn Animal>
等效于Box<dyn Animal + 'static>
,这意味着指向整个程序中有效的内容的指针(如字符串文字)。这可能不是您想要的。
您希望这样做,使您的Zoo
的寿命不能超过您的Animal
的寿命。 (这是编译器将强制执行的)。因此,您用生命周期Zoo
注释'a
,并且要求存储在Animal
中的每个Zoo
的寿命至少要长到'a
:>
pub struct Zoo<'a> {
animals: VecDeque<Box<dyn Animal + 'a>>,
}
编译器将检查您的生命周期批注是否有意义,并强制引用不能超过对象寿命。