我正在尝试创建一个结构的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
但是当我移动它时,这仍然不起作用。
如前所述,Box<dyn Animal>
等价于Box<dyn Animal + 'static>
,这意味着指向在整个程序中有效的指针(如字符串文字(。这可能不是您想要的。
您希望您的Zoo
寿命不能超过您的Animal
(这是编译器将强制执行的内容(。因此,您用生命周期'a
注释Zoo
,并且要求存储在Zoo
中的每个Animal
至少与'a
一样长:
pub struct Zoo<'a> {
animals: VecDeque<Box<dyn Animal + 'a>>,
}
编译器将检查您的生存期注释是否有意义,并强制引用不能超过对象的生存期。