我想在Rust中声明一个类型为Vector of trait的成员,但它会返回此错误:
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>,
}
我试图在互联网上搜索如何解决这个错误而没有运气。任何人都可以给我一个光明吗?非常感谢您的帮助。
答案 0 :(得分:3)
Animal
是一个特征,这意味着它可以通过任何来实现。因此,您必须告诉编译器 Animal
中实现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
也可能有用。
仅供参考,第二种形式基本上只是说“一个借用的引用,它对所有生命周期'xxx
(&'xxx
部分)有效,对一个实现Animal
的值,其中任何引用所述值包含对至少生命周期'xxx
(+ 'xxx
部分)有效。“