1

我正在尝试创建一个 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但是当我移动它时,它仍然不起作用。
4

1 回答 1

0

正如已经指出的,Box<dyn Animal>等价于Box<dyn Animal + 'static>,这意味着指向在整个程序中有效的东西的指针(如字符串文字)。这可能不是你想要的。

您希望它Zoo不会比您Animal的 s 活得更久。(这是编译器将强制执行的)。Zoo因此,您用一生进行注释,'a并且您要求Animal存储在Zoo生命中的每个内容至少只要'a

pub struct Zoo<'a> {
    animals: VecDeque<Box<dyn Animal + 'a>>,
}   

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

于 2019-10-21T13:12:25.270 回答