我想声明一个具有锈蚀特征向量类型的成员,但是它返回了这个错误:
error: explicit lifetime bound required
这就是我迄今尝试过的:
struct Lion {
legs: int,
}
trait Animal {
fn eat(&self);
}
impl Animal for Lion {
fn eat(&self) {
println!("Eat");
}
}
struct Zoo {
animals: Vec<Animal>,
}我试图在互联网上搜索如何在没有运气的情况下修复这个错误。有人能给我点光吗?非常感谢你的帮助。
发布于 2014-11-30 10:45:15
Animal是一个特性,这意味着它几乎可以通过任何东西来实现。因此,您必须告诉编译器,在Vec中实现Vec的每个东西所包含的引用将有效多长时间。
例如,您可能有一个包含短暂生命周期的Dodo;您不希望它在Vec中灭绝,从而导致内存不安全!
你需要用任何一个
struct Zoo {
animals: Vec<Animal + 'static>,
}或
struct Zoo<'a> {
animals: Vec<Animal + 'a>,
}第一种声明,任何可访问的引用都将在程序的整个生命周期内有效。第二种状态是,存在一些可访问的所有引用都有效的生存期'a。但问题是,这段代码无论如何都是无效的,因为.
error: the trait `core::kinds::Sized` is not implemented for the type `Animal+'static`您不能有一个值的Vec是动态大小的,其中包括特征。您可以通过使用Box<Animal + 'xxx>或&'xxx Animal + 'xxx来解决这个问题。Box将更容易管理。
编辑:准确地说,任何接受
Sized?参数的类型都在这里工作。这归结为任何形式的间接参考。Rc和Arc可能也能工作。
FYI,第二种形式基本上只表示“对所有生存期'xxx ( &'xxx部件)都有效的借用引用,对实现Animal的值有效,其中所述值包含的引用至少对生存期'xxx ( + 'xxx部分)有效。”
https://stackoverflow.com/questions/27212238
复制相似问题