处理盒子和特征对象

Dealing with boxes and trait objects

我有一个具有某些特征 core::Object 对象的盒子向量:

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

现在,我想要 Packfile 的一种方法 return 这些对象之一可选:-> Option<Box<core::Object + 'a>>。因此,将 i 作为我想要的索引的参考,我 return 这个:

Some(self.objects[*i])

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

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

现在,这是我不明白的地方。 self.objects[*i] 是一个盒子, clone() on boxes do this: 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()),
                                         ^~~~~~~~~~~~~~~~~~~~~~~~

所以我不明白为什么我在 clone() 中得到 T 而不是 Box<T>

你能帮帮我吗?

So I don't get why I'm getting a T and not a Box out of clone().

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

如果您只需要对对象的引用就可以了,您可以这样做:

Some(&self.objects[*i])

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