处理盒子和特征对象



我有一个包含某些特征core::Object对象的框的向量:

pub struct Packfile<'a> {
    pub version: u32,
    pub objects: Vec<Box<core::Object + 'a>>,
    ...

现在,我希望一种Packfile方法可以选择返回其中一个对象:-> Option<Box<core::Object + 'a>> .因此,将i作为我想要的索引的引用,我返回以下内容:

Some(self.objects[*i])

好的,这不起作用,因为我正在将盒子移到 vec 之外。意义。让我们clone它(core::Object继承自Clone)。

Some(self.objects[*i].clone())

现在,这是我不明白的。 self.objects[*i]是一个盒子,盒子上的clone()是这样做的:impl<T> Clone for Box<T> where T: Clone { fn clone(&self) -> Box<T>; }所以clone()应该给我一个盒子,对吧?但是我收到此错误:

src/packfile/mod.rs:190:20: 190:44 error: mismatched types:
 expected `Box<core::Object + 'a>`,
    found `core::Object + 'a`
(expected box,
    found trait core::Object)
src/packfile/mod.rs:190             Some(self.objects[*i].clone()),
                                         ^~~~~~~~~~~~~~~~~~~~~~~~

所以我不明白为什么我会得到一个T而不是一个Box<T> clone().

你可以帮我吗?

如果您只引用对象就可以了,您可以执行以下操作:

Some(&self.objects[*i])

您甚至可以实现Index以利用索引运算符,因此您可以执行some_packfile[3]

所以我不明白为什么我要从克隆()中得到一个 T 而不是一个盒子。

方法也会执行自动取消引用。我不知道core::Object是什么,但如果它实现了Clone,这就是为什么,我敢打赌。

最新更新