在Rust中声明矢量字段

时间:2014-11-30 10:26:34

标签: rust

我想在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>,
}

我试图在互联网上搜索如何解决这个错误而没有运气。任何人都可以给我一个光明吗?非常感谢您的帮助。

1 个答案:

答案 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?参数的类型都适用于此处。这归结为任何形式的参考间接。 RcArc也可能有用。

仅供参考,第二种形式基本上只是说“一个借用的引用,它对所有生命周期'xxx&'xxx部分)有效,对一个实现Animal的值,其中任何引用所述值包含对至少生命周期'xxx+ 'xxx部分)有效。“