如何将生存期应用于VecDeque <Box <dyn Trait >>?

时间:2019-10-21 00:28:08

标签: rust trait-objects

我正在尝试创建结构的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));
    }
}

两个问题:

  1. 有人可以解释一下如何正确使用'a以及它如何工作/其含义是什么?而且我猜为什么我在这里甚至需要一辈子(是因为我在使用Box)?
  2. 我也很困惑为什么必须使用#[path="..."],因为如果没有它,它会要求我将文件移动到src/lib/animal.rs,但是当我将其移动时,仍然无法使用。

1 个答案:

答案 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>>,
}   

编译器将检查您的生命周期批注是否有意义,并强制引用不能超过对象寿命。