【发布时间】:2020-02-17 01:53:00
【问题描述】:
我正在尝试创建一个 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));
}
}
两个问题:
- 谁能解释一下如何正确使用
'a以及它是如何工作的/这意味着什么?而且我猜为什么我什至需要在这里度过一生(是因为我使用的是 Box)? - 我也很困惑为什么我必须使用
#[path="..."],因为没有它,它会要求我将文件移动到src/lib/animal.rs,但是当我移动它时,它仍然不起作用。
【问题讨论】:
-
play.rust-lang.org/…,但我不知道这样做是否有意义
-
@Stargateur 太棒了,你修复了它,我现在可以编译了 :) 非常感谢你抽出宝贵的时间!关于它是如何工作的以及为什么它比静态更好,是否有一些基本逻辑?你还说你不知道这样做是否有意义,这不是最好的路线还是有其他原因?
-
@John
Box<dyn Animal>在此上下文中等于Box<dyn Animal + 'static>。因此,您放入VecDeque的任何内容都必须是'static- 这就是您在add方法的where子句中添加'static绑定的原因。'static限制了您可以放入Zoo的内容,只有其中没有引用(或带有'static引用)的对象才是'static本身。 -
@John 那么
#[path="..."],你违反了关于项目结构的约定。以下是相关文档:doc.rust-lang.org/book/… -
感谢您关注@L117。关注doc.rust-lang.org/book/… 我仍然无法正常工作。它要求我在
src/lib/front_of_house.rs中创建一个文件,而不是在src/front_of_house.rs中,正如指南所建议的那样。我正在使用 2018 版,无法弄清楚我做错了什么。
标签: rust trait-objects